gpt4 book ai didi

go - 接口(interface)怎么可能具有可比性,同时又不能发挥作用呢?

转载 作者:IT王子 更新时间:2023-10-29 02:25:48 24 4
gpt4 key购买 nike

我有以下代码片段:

type F func()

type I interface {}

func A() {}

func B() {}

func test() {
var a interface{} = A
var b interface{} = B
if A == B { // 1. Compile error
// Code
}

if a == b { // 2. No compile error
// Code
}
}

如果函数不可比较而接口(interface)可比较,为什么我可以将函数分配给接口(interface)类型?

--

为了澄清我的问题,另一个代码片段:

type I interface {
DoSomething()
}

type F func()

func (f F) DoSomething() {
f()
}

func A() {
fmt.Println("A")
}

func B() {
fmt.Println("B")
}

func test() {
var _a F = A
var _b F = B
var a I = _a
var b I = _b

if a == b { // 2. No compile error but panic
// Code
}
}

在我看来,我可以通过简单的赋值来打破类型系统。

我不建议功能应该具有可比性。我的问题是:

  • 为什么默认情况下接口(interface)是可比较的?
  • 为什么不能将接口(interface)标记为可比较的 resp。没有可比性?
  • 为什么不能定义用户定义的平等?
  • 这种语言设计的动机是什么?

最佳答案

这就是语言的定义方式。来自spec :

Interface values are comparable. Two interface values are equal if they have identical dynamic types and equal dynamic values or if both have value nil.

A comparison of two interface values with identical dynamic types causes a run-time panic if values of that type are not comparable.

function values are not comparable. However, as a special case, a [...] function value may be compared to the predeclared identifier nil.

这解释了为什么您的示例中的第一个 if 语句在编译时失败,以及为什么第二个语句在运行时失败。

关于go - 接口(interface)怎么可能具有可比性,同时又不能发挥作用呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47224422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com