类型断言的使用

package main

import "fmt"

func main() {
   var x any // 必须是any数据类型的变量才能进行类型断言,已经确定变量数据类型还断言就是多此一举

   // ========== 断言失败DEMO ========== //
   x = "从入门到放弃"
   t1, ok1 := x.(int) // 断言变量x的数据类型为int(从上面的赋值可知x是string数据类型,所以本次断言必然失败)
   if ok1 == true {
      fmt.Printf("断言成功,变量x是int类型,其值为%d \n", t1)
   } else {
      fmt.Printf("断言失败,变量x不是int类型,此时t1的值为%d \n", t1) // 断言失败,变量x不是int类型,此时t1的值为0
      // 重要说明:由于断言失败,t1的值就会被设为断言类型(即int类型)的零值,也就是0
   }

   // ========== 断言成功DEMO ========== //
   x = 9527
   t2, ok2 := x.(int) // 断言变量x的数据类型为int,(从上面的赋值可知x确实是int数据类型,所以本次断言必然成功)
   if ok2 == true {
      fmt.Printf("断言成功,变量x是int类型,其值为%d \n", t2) // 断言成功,变量x是int类型,其值为9527
   } else {
      fmt.Printf("断言失败,变量x不是int类型,此时t2的值为%d \n", t2)
   }
}

// ========== 总结 ========== //
// 1、类型断言实际上就是判断一个any数据类型的变量是否为指定的具体数据类型,如果是则断言成功,否则断言失败。
// 2、类型断言有两种写法,分别是:『t := x.(数据类型)』和『t, ok := x.(数据类型)』,如无特殊需求都是使用第二种写法。
//    第一种写法如果断言成功就会把x的值赋给t,但是如果断言失败就会报panic,所以通常都不会使用这种写法。
//    第二种写法断言失败不会报panic,若断言成功则ok为true,并且会把x的值赋给t,若断言失败则ok为false,
//    并且会把断言中数据类型的零值(注:零值指的是数字0、空字符串、false等值)赋给t,相当于『t = new(数据类型)』。
// 3、类型断言主要用于断言结构体变量,通过断言确定变量是什么结构体,就可以使用该结构体的字段和方法。
// 4、类型断言还经常用于判断不定参数的数据类型。
// 5、对网络请求的返回值进行断言需要特别注意,Go语言会将整数当成float64,而不是int或int64,所以必须先断言为float64,
//    拿到float64类型的数值后再进行类型转换,例如某接口返回了如下内容:
//    {"errcode":40029,"errmsg":"invalid code"}
//    这时应该断言errcode为float64类型,然后将float64转为int64再使用。

Copyright © 2024 码农人生. All Rights Reserved