来自 新葡亰数据库 2019-11-06 19:36 的文章
当前位置: 澳门新葡亰app > 新葡亰数据库 > 正文

在此跟大家說一下GO語言是如何轉換數據類型的

前不久因應同事提的少年老成則必要,寫了后生可畏段 CASE WHEN 的整數與小數處理

在開始风流洒脱個新的章節在此以前先來回顧上黄金时代篇小说的部份,首先作者們來看這段代碼:

過程中竟然踩了個雷,特此記錄下來

package main    import (        "fmt"    )    func main(){        var x,y int=1,2        {            var x int=2            {                var x int=3                fmt.Println    //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何?            }            fmt.Println        //其次輸出2,2        }        fmt.Println            //最後輸出1,2    }

先是,要求如下:

執行結果作者已經加到註釋內了,其實沒须要好奇,GO語言就是如此,這種陡然出現的大括號構成了複合語句,大括號內的變量功用範圍只好在變量內部,這就关乎到變量的功用域了,在PHP中變量也许有效能域的,但是PHP遭受這種乍然出現的大括號時不會構成這種複合語句,由此也就不會影響到變量的成效域,這风度翩翩點請謹記
说不上我們在PHP中的function內使用全局變量的時候日常要用global把全局變量引进進來,但是在GO語言中没有必要那麼麻煩,全局變量若是出現在function前邊就可以直接在function內使用,而无需額外的描述,在GO語言中,全局變量的效率範圍是當前的package,局地變量的效率域被限制到了其所在的大括號內.

當內容為整數或零時則去掉尾端的小數否則就顯示原来的小數內容

上意气风发篇小说笔者在介紹數據類型的時候有关联生龙活虎個數據類型轉換的部份,在这里跟我们說一下GO語言是如何轉換數據類型的.
先是笔者們要通晓,GO語言是類型安全的,它不允許數據類型隱式轉換否則會形成精度丟失,在go語言中享有的類型轉換必須要顯式進行能力够.
其顯式轉換方法其實极度簡單
變量1=<變量1的類型>(<變量2>)
例如:
v1:=3.14
var v2 int
v2=int
上例小编把浮點型的v1顯式轉換成了int型.此時v2的值是3
在顯式轉換的時候有幾點须求注意一下:
int型能够轉為float型
float型能够轉為int型
string型能够轉為[]byte和[]int型
[]byte能够轉為string型
[]int能够轉為string型
除了那些之外別的都不足以.
這樣的類型轉換能够有限支撑變量的類型是高枕而卧的,不會像PHP那樣類型被私行轉換了,比如:
var_dump;
這句代碼按理說應該是兩個string串接輸出string才對,但是PHP的隱式轉換把他的類型給改了,變成了int,這種狀況在GO語言中是不會發生的.
而外這種類型轉換格局之外GO語言還提供了风流倜傥個標準的package用來對數據類型進行轉換,這個package的名字是strconv,它提供的办法有:
Atoi (bool,error) 接纳字符串參數轉為Int型
Itoa 选择Int型參數轉為字符串
FormatBool string 选取布爾參數轉為string型
FormatFloat(float64,浮點格式,輸出精度,[位數32,64]) string 选择布爾參數轉為string型
FormatInt(int64,[進制2,8,10,16]) string 选择int型參數根據進制轉為string型
FormatUint(int64,[進制2,8,10,16]) string 同上,接受無符號int型參數根據進制轉為string型
ParseBool (bool,error) 采用字符串參數轉為bool型
ParseFloat(字符串,[位數32,64]) (bool,error) 选用字符串參數轉為Float型
ParseInt(字符串,[進制2,8,10,16],[位數0,8,16,32,64]) (bool,error) 选用字符串參數轉為Int型
ParseUint(字符串,[進制2,8,10,16],[位數0,8,16,32,64]) (bool,error) 同上,接收字符串參數轉為無符號Int型

若內容為 NULL 也維持不變

這些方法在進行數據類型轉換的時候也是极度实惠的,需求相当细心一下.

举个例子: 120.000 要顯示為 120 , 而 120.12345 則維持不變 

那麼接下來的時間笔者們就注重介紹一下GO語言的流程序调整制,這個部份首要涉及到if;switch;和循環,
先是笔者們來看一下if部份.首先作者們看一下下邊這段代碼:

在聽完须要後,小编相当慢寫了以下這段 CASE WHEN 判斷

var a int    a=xx()    if a==1{        fmt.Println    }else if a==2{        fmt.Println    }else{        fmt.Println    }

图片 1

通過上邊的代碼不難發現其實GO語言的if寫法和別的編程語言幾乎沒有差別,但是要在乎生机勃勃點,那就是條件語句不能够出現小括號,還有便是左大括號必須要出現在判斷語句的尾巴,无法寫到新的后生可畏行.有如上邊的這個demo就不能够這樣寫:

但看起來行不通阿!!! 能够看来本人在 THEN 的時候直接轉成INT類型,但出來的結果還是DE亚洲龙L類型
此時同事說了句,是或不是有希望型態在CASE WHEN時就已經決定了

var a int    a=xx()    if                //這是第一個錯誤    {                       //這是第二個錯誤        fmt.Println    }    注意一下這兩點就差不多了,除了上邊說的這個注意事項之外還有一點需要注意的地方,請看下邊的代碼:    if a:=xx();a==1{        fmt.Println    }    fmt.Println          //這是錯誤的,因為變量a屬於if的區域變量

經過測試大概打理出邏輯如下

在這個demo中變量a被安置了if同生龙活虎行中,此時a就屬於這個if的區域變量
總結一下,在GO語言中if在使用的時候要留神三點就够用了,分別是:1.條件語句无法有小括號,2.左大括號必須要松手語句的結尾,3.任何語句能够放置提交語句的左側,此時若有給變量賦值,那麼這個變量的职能範圍被局限在if內

CASE WHEN 是透過全部 THEN 值的型態優先順序,來決定最終型態為何

接下來笔者們看一下GO語言的switch用法,首先小编們來看一下下邊的代碼:

當当中意气风发個型態無法做隱含轉換時(例如像下圖的文字無法直接轉換成小數) ,就會出錯

var a int    a=xx()    switch a{        case 1:            fmt.Println        case 2,3:            fmt.Println        case 4:            fmt.Println            fallthrough        case 5:            fmt.Println        default:            fmt.Println    }    fmt.Println

图片 2

在上邊的這個demo中倘使你仔細看的話您會發現GO語言的switch用法和别的語言差異异常的小,不过每风度翩翩個case都沒有break,這是因為GO語言默認情況下是无需加break的,在上邊的例子中黄金年代经a的值等於1,那麼會輸出"1結束",见到沒有根本就没有供给参加break就能够自動跳出switch,那麼假设當a的值等於4的時候會輸出"45結束",這是因為fallthrough的緣故,fallthrough能够讓case能夠被通过,初次之外GO語言的switch還有后生可畏種更加高級的用法,最少這種用法早先我沒有在任何語言中見過,這種用法讓switch可以當if用,看下邊的demo:

 

a:=xx()    switch {                    //左大括號必須要和switch同一行        case a<0:            fmt.Println        case  && :            fmt.Println        case  && :            fmt.Println        default:            fmt.Println    }

而透過下列的語法,可以活动測試各種組合的最終型態的優先權為何

看上邊的例证,在switch后沒有了判斷語句,而判斷語句被获得了case後邊,這正是本人上邊所講的switch拿來當if用.
那麼我們來總結一下switch的注目事項吧:1.左大括號必須要和switch同大器晚成行,2.没有需求动用break跳出case,3.若是急需穿透case就必須要加fallthrough,4.能够不加判斷語句把其當if來用.

DECLARE @T DECIMAL(10,4) = 192.1233
SELECT 
SQL_VARIANT_PROPERTY(IntAndDecimal,'BaseType'), 
IntAndDecimal
FROM 
(
SELECT 
CASE 
WHEN @T = FLOOR(@T)
THEN CAST(@T as varchar)
WHEN @T > FLOOR(@T) 
THEN CAST(@T as INT)
WHEN @T < FLOOR(@T) 
THEN CAST(@T as decimal)
END as IntAndDecimal 
) X  

最後笔者們說一下GO語言的循環,在GO語言中唯有意气风发個for用來循環,别的語言中常見的white;do..while;do..loop;foreach;while等循環格局都沒了,這意气风发雨后冬笋亂七八糟的循環方式在GO語言中只要求for就够用了.接下來作者們通過幾個demo來逐大器晚成講解for是怎麼做到這些的.看代碼

 從下圖能够见见當CASE WHEN 同時有 varchar 、 int 、 decimal 、 float 時

for i:=0;i<10;i++{      //注意不要加小括號,左大括號必須要在同一行        fmt.Println    }

最後會統大器晚成轉換成float型態 

這是常見的大器晚成種用法了,除了不要加小括號和左大括號必須要出現在行尾之外,跟別的編程語言沒有任何差異,由此針對這種循環情势自己就不再細說了.接下來我們看第二種用法:

 图片 3

i:=0    for ;i<10;i++{        fmt.Println    }    fmt.Println("繼續輸出:",i)

相關的公文能够參考官網

在這個例子中變量i被得到了for循環之外定義,所以在for上自家就不供给在對其進行額外的定義動作了,只需求生机勃勃個分號就够了,等到for循環結束之後作者還能够輸出變量i的值,因為此時的變量不再專屬於for.再接著看

最後

 i:=0    for i<10{        fmt.Println        i++    }    fmt.Println("繼續輸出:",i)

以下正是本身寫的完整語法,能够阅览透過在 THEN 作者分邊加了兩個 CAST 轉換

在這個例子中第三個條件語句也沒了,被自个儿获得了for內部,所以自己就能够把條件語句中的分號都給省略掉.是否很有意思,其實這就已經能夠替代while了.或許您還感覺不過癮,那好接下來笔者們弄個更狠的

在優先權的比較後,最後的型態會統风度翩翩轉換成  Float ,所以原来會以 DE杰德L 為主的型態已經消失了

 i:=0    for {        if i>10{            break        }        fmt.Println        i++    }    fmt.Println("繼續輸出:",i)

相關的意义也足以參考兩個 Column  的值 ,最右邊為預期的結果,左邊則為原始結果

看来沒,do..loop或do..while之類的都被代表了.用這種循環格局時要注意调控跳出循環,要不然的話弄個死循環就糟糕了.啥你不知道怎麼寫死循環?好啊

图片 4

for {        fmt.Println    }

来看沒正是這麼簡單就死循環了.若是您不相信你能够友善執行試試就清楚效果了.最终就只剩下foreach寫法了,看下邊的例子

 i:=[]string{"aa","bb","cc"}    for k,v:=range i{        fmt.Println    }

通過這段代碼就会把數組的鍵名和值給逐行輸出

接下來小编們來總結一下GO語言的for循環要求潜心的事項:1.條件語句不能够加小括號,左大括要和for在同等行,2.假使條件語句超過兩個,則分號一定要难
除此以外for循環會涉及到break和continue的用法,如有不懂的相爱的人能够本身上網搜一下,這個比較簡單在那小编就不再贅述了.
還有就是GO語言加了goto,說實話作者特别不建議大家用,在这里順便朝气蓬勃提,有興趣的心上人能够团结商讨一下.

但愿轉載小说的相爱的人能夠留风度翩翩個稿子出處, 在那感谢不盡!

剛成立了意气风发個QQ群,有興趣討論GO語言的心上人能够出席:一九五二12

本文由澳门新葡亰app发布于新葡亰数据库,转载请注明出处:在此跟大家說一下GO語言是如何轉換數據類型的

关键词: