var any interface{} any = 1 fmt.Println(any) any = "hello" fmt.Println(any) any = false fmt.Println(any)代码输出如下:
1
hello
false
// 声明a变量, 类型int, 初始值为1 var a int = 1 // 声明i变量, 类型为interface{}, 初始值为a, 此时i的值变为1 var i interface{} = a // 声明b变量, 尝试赋值i var b int = i第8行代码编译报错:
cannot use i (type interface {}) as type int in assignment: need type assertion
编译器告诉我们,不能将i变量视为int类型赋值给b。var b int = i.(int)修改后,代码可以编译通过,并且 b 可以获得 i 变量保存的 a 变量的值:1。
==
进行比较操作。空接口的比较有以下几种特性。
// a保存整型 var a interface{} = 100 // b保存字符串 var b interface{} = "hi" // 两个空接口不相等 fmt.Println(a == b)代码输出如下:
false
// c保存包含10的整型切片 var c interface{} = []int{10} // d保存包含20的整型切片 var d interface{} = []int{20} // 这里会发生崩溃 fmt.Println(c == d)代码运行到第8行时发生崩溃:
panic: runtime error: comparing uncomparable type []int
这是一个运行时错误,提示 []int 是不可比较的类型。下表中列举出了类型及比较的几种情况。类 型 | 说 明 |
---|---|
map | 宕机错误,不可比较 |
切片([]T) | 宕机错误,不可比较 |
通道(channel) | 可比较,必须由同一个 make 生成,也就是同一个通道才会是 true,否则为 false |
数组([容量]T) | 可比较,编译期知道两个数组是否一致 |
结构体 | 可比较,可以逐个比较结构体的值 |
函数 | 可比较 |
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有