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
}
對于類型斷言的補充說明:
-
如果類型斷言出錯(就是判斷失敗的情況),第二個返回值一定要顯式申明或者忽略百新,否則編譯器會拋出exit status 2,并終止編譯庐扫,例如:
b,ok := a.(string) //如果類型判斷錯誤饭望,則b為相應判斷類型的零值,而ok為bool類型的false b,_ := a.(float64)
而在類型斷言成功的話形庭,第二個返回值可以不用接受铅辞,程序正常運行
也就是說,如果這個斷言不成功的話萨醒,還沒有第二個接收者斟珊,那么就會panic。 如果斷言失敗富纸,第二個接收者被拋棄囤踩,也就是_,那么程序不會panic