在 Go 语言中,interface{}
和 any
具有相同的作用,它们都可以存储任意类型的值,但它们之间的区别在于历史和语义上的不同。
Any 定义:type any = interface{}
共性
-
代表任意类型:无论是
interface{}
还是any
,它们都可以容纳任何类型的值。这意味着你可以将基本类型(如int
、string
)或自定义类型(如结构体、切片)赋给它们。示例:
var x interface{} = 42 var y any = "Hello"
-
类型断言:两者都支持类型断言,通过类型断言可以从
interface{}
或any
中提取出具体的类型。示例:
var a interface{} = 10 v, ok := a.(int) // 使用类型断言
-
作为函数参数:它们都可以作为函数的参数类型,使得函数能够接受任何类型的参数。
示例:
func PrintValue(v any) { fmt.Println(v) }
差异
-
术语差异:
interface{}
是 Go 语言从一开始就存在的语法,称为空接口。any
是从 Go 1.18 开始引入的类型别名(type any = interface{}
),它只是interface{}
的语法糖,目的是让代码在语义上更具可读性。
-
可读性与现代化:
interface{}
表示一个空接口,直接看代码时可能不太直观。any
是 Go 1.18 引入的,为了提高代码的可读性,表示这个值可以是“任何”类型的值,更符合现代编程习惯。
示例
// 使用 interface{}
var x interface{} = 42
// 使用 any(Go 1.18 及以上版本)
var y any = "Hello"
从技术上讲,any
和 interface{}
是等价的,但 any
使代码更具表达力,特别是在泛型编程中,any
被推荐使用。
总结
interface{}
是 Go 早期的写法,而 any
是 Go 1.18+ 的现代语法糖,它们在功能上完全一致,只是 any
旨在让代码更易读。