ifelse
if 20>0{
fmt.Println("yes")
}
輸出
yes
ifelse
if 20<0{
}else{
fmt.Println("no")
}
輸出
no
switch 和 type switch
switch
好理解,是一個替代if else else else
接口而提出的,如下,switch
後跟變量,case
後跟常量,只要變量值和常量匹配,就執行該分支下的語句。
switch name {
case "coding3min":
fmt.Println("welcome" + name)
default:
fmt.Println("403 forbidden:" + name)
return
}
當然switch
語句會逐個匹配case
語句,一個一個的判斷過去,直到有符合的語句存在。
switch {
case number >= 90:
fmt.Println("優秀")
case number >= 80:
fmt.Println("良好")
case number >= 60:
fmt.Println("湊合")
default:
fmt.Println("太搓了")
}
如果沒有一個是匹配的,就執行default
後的語句。
注意switch
後可以跟空,如上
switch {
這樣case
就必須是表達式。
switch 的高級玩法?
有一個流傳於坊間的神祕玩法,可以用switch
語句來判斷傳入變量的類型,然後做一些羞羞的事情。x
是一個未知類型的變量,switch t := x.(type)
用這個方式來賦值,t
就是有確定類型的變量。
switch t := x.(type) {
case int:
return t
case float64:
return int(math.Ceil(t))
}
什麼叫未知類型??
這就是 go
中有意思的地方了, interface{}
類型,是一種神奇的類型,他可以是任何類型的接口,而具體的類型是實現。
var x interface{}
x = 1
fmt.Println(x)
輸出1
所以完整的函數是這樣的
func typeSwitchDemo(x interface{}) int {
switch t := x.(type) {
case int:
return t
case float64:
return int(math.Ceil(t))
}
return 0
}
這個東西有什麼用呢??有沒有想過如果你有一個場景,你在調用第三方的接口,卻發現對方的接口發生了微調,原來的int
類型,被轉換成了string
類型,你必須寫出兼容兩種方式的代碼來解析json
。
那麼這個時候,type switch
將會是你的武器。
感興趣可以 跑到這裏看看,我是怎麼使用這個武器的。
https://github.com/pzqu/how_to_code/blob/master/golang/medium/json_interface/fixed_json.go