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