在 Go 语言中,interface{}any 具有相同的作用,它们都可以存储任意类型的值,但它们之间的区别在于历史和语义上的不同。

Any 定义:type any = interface{}

共性

  1. 代表任意类型:无论是 interface{} 还是 any,它们都可以容纳任何类型的值。这意味着你可以将基本类型(如 intstring)或自定义类型(如结构体、切片)赋给它们。

    示例:

    var x interface{} = 42
    var y any = "Hello"
  2. 类型断言:两者都支持类型断言,通过类型断言可以从 interface{}any 中提取出具体的类型。

    示例:

    var a interface{} = 10
    v, ok := a.(int) // 使用类型断言
  3. 作为函数参数:它们都可以作为函数的参数类型,使得函数能够接受任何类型的参数。

    示例:

    func PrintValue(v any) {
       fmt.Println(v)
    }

差异

  1. 术语差异

    • interface{} 是 Go 语言从一开始就存在的语法,称为空接口
    • any 是从 Go 1.18 开始引入的类型别名(type any = interface{}),它只是 interface{} 的语法糖,目的是让代码在语义上更具可读性。
  2. 可读性与现代化

    • interface{} 表示一个空接口,直接看代码时可能不太直观。
    • any 是 Go 1.18 引入的,为了提高代码的可读性,表示这个值可以是“任何”类型的值,更符合现代编程习惯。

示例

// 使用 interface{}
var x interface{} = 42

// 使用 any(Go 1.18 及以上版本)
var y any = "Hello"

从技术上讲,anyinterface{} 是等价的,但 any 使代码更具表达力,特别是在泛型编程中,any 被推荐使用。

总结

interface{} 是 Go 早期的写法,而 any 是 Go 1.18+ 的现代语法糖,它们在功能上完全一致,只是 any 旨在让代码更易读。