流程控制,簡易小數處理

 百家乐-数据     |      2019-12-26 08:49

明天因應同事提的一則要求,寫了生龙活虎段 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]卡塔尔(英语:State of Qatar) (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是怎麼做到這些的.看代碼