三分鐘學 Go 語言——條件語句+switch和type switch

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章