package main
import (
"fmt"
"math"
)
func main() {
var a interface{}
a = "I am OK"
a = 23.87
//第一種情況
//類型斷言
b,ok := a.(string)
if ok {
fmt.Println(b)
}
//--------------
r,err := a.(float64)
if err {
fmt.Println(math.Pi * r * r)
}
//第二種情況
//map取值
m := map[string]int{
"math" : 95,
"langue" : 90,
"english" : 89,
}
result := m["langue"]
fmt.Println(result)
//-------------
var exit bool
result, exit = m["english"]
if exit {
fmt.Println(result)
}
//第三種情況slice/map
s := []string{"hello", "world", "golang"}
for k := range s{
fmt.Print(k)
}
//output: 012 為索引值
var m map[string]int = map[string]int{
"golang": 1,
"c++": 2,
"python": 3,
}
for k := range m{
fmt.Println(k)
}
//output:golang
}
對(duì)于類型斷言的補(bǔ)充說明:
-
如果類型斷言出錯(cuò)(就是判斷失敗的情況),第二個(gè)返回值一定要顯式申明或者忽略,否則編譯器會(huì)拋出exit status 2,并終止編譯,例如:
b,ok := a.(string) //如果類型判斷錯(cuò)誤,則b為相應(yīng)判斷類型的零值,而ok為bool類型的false b,_ := a.(float64) 而在類型斷言成功的話,第二個(gè)返回值可以不用接受,程序正常運(yùn)行
也就是說,如果這個(gè)斷言不成功的話,還沒有第二個(gè)接收者,那么就會(huì)panic。 如果斷言失敗,第二個(gè)接收者被拋棄,也就是_,那么程序不會(huì)panic