【Golang】Go语言那些返回值数量变化的语句?

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

你可能感兴趣的:(【Golang】Go语言那些返回值数量变化的语句?)