如何形象地理解 interface{} 概念

请问 interface{} 如何能够正确的理解此概念呢?由于太抽象了,看了很多视频都是把一些方法封装起来用 interface 来实现这些方法,但总是感觉这些举例子与实际应用差了一些,有没有一种通俗易懂的解释呢?或者举例一个简易的应用场景,谢谢🙏~

最佳答案

空接口,相当于关闭了类型检查,相当于泛型里的any,什么值都可以赋给空接口。但是赋值之后别忘了使用类型断言将空接口类型的变量转换为具体的类型,才好进行计算或者使用

应用场景:加法计算

func Add(a, b interface{}) interface{} {
    // 别想不断言就直接 a + b,会提示空接口不存在运算符+
    switch a1, a2:= a.(type), b.(type) {
    case int:
        return a1 + a2
    case float64:
        return a1 + a2
    case float32:
        return a1 + a2
    default:
        return new errors.New("error!")
    }
}

但是很尴尬的是,输出的类型还是空接口类型,需要再次转换才可以再次运算,所以常有人调侃golang难以实现1+1

// 这是js, golang空接口返回值不能和 untyped int 计算
function add(a, b) {
    return a + b
}
function foo() {
    add(1, 1) + 1
}

现在可以用泛型解决这个问题了

func Add[T int | float64 | float32](a,b T) T {
    return a + b
}
2年前 评论
讨论数量: 5

interface可以看成一个包,什么东西都可以放,用的时候拿出来的东西需要判断下是什么东西,正确了才能用

2年前 评论

你可以看看 《GOPL》 里的整个第 7 章,讲接口类型,尤其是 7.3。普通的接口要求实现它的数据类型具备某些指定的方法,而 interface{} 实际上是一个空接口,也就是说实现这个接口没有要求,相当于 0 成本,所以我们可以将任意一个值赋给空接口类型:

var any interface{}
any = true
any = 12.34
any = "hello"
any = map[string]int{"one": 1}
any = new(bytes.Buffer)
2年前 评论

可以理解成为一个任意值,然而这个接口具体按什么值进行处理,还得看断言

2年前 评论

可以理解为一个基础数据结构或者基类,所有的数据结构都实现或继承了它

2年前 评论

空接口,相当于关闭了类型检查,相当于泛型里的any,什么值都可以赋给空接口。但是赋值之后别忘了使用类型断言将空接口类型的变量转换为具体的类型,才好进行计算或者使用

应用场景:加法计算

func Add(a, b interface{}) interface{} {
    // 别想不断言就直接 a + b,会提示空接口不存在运算符+
    switch a1, a2:= a.(type), b.(type) {
    case int:
        return a1 + a2
    case float64:
        return a1 + a2
    case float32:
        return a1 + a2
    default:
        return new errors.New("error!")
    }
}

但是很尴尬的是,输出的类型还是空接口类型,需要再次转换才可以再次运算,所以常有人调侃golang难以实现1+1

// 这是js, golang空接口返回值不能和 untyped int 计算
function add(a, b) {
    return a + b
}
function foo() {
    add(1, 1) + 1
}

现在可以用泛型解决这个问题了

func Add[T int | float64 | float32](a,b T) T {
    return a + b
}
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!