我正在学习Golang,发现了一些有趣的发现...

  1. 介绍了类型约束接口.它只能用于泛型(如果我没有错的话).那么为什么Go不允许我们直接使用它呢...
import "fmt"
type I interface {
    int   // if I comment this entire line, code works. otherwise panics at line 6
}
func main() {
    var i I // panics : interface contains type constraints
    i = 3
    fmt.Println(i)
}

上面的例子在第8行出现了panic (接口包含类型约束).

  1. 这个问题是关于"任何"和"可比"的.根据文档,这些不是关键词.这些是别名.这意味着,当go在某个地方找到"any"时进行编译,它会将其作为接口{}?如果是的话,那么"可比"呢.编译器到底认为它是什么?

推荐答案

从go版本1.18开始,只有基本接口(参见:https://go.dev/ref/spec#Basic_interfaces)可以用作变量类型.基本接口只指定方法.

从规范的"通用接口"部分:

非基本接口只能用作类型约束,或

正如@mkopriva在 comments 中指出的,这不是panic ,而是编译时错误.您的代码(https://go.dev/play/p/qw3zh89n_gs)会产生以下错误:

./prog.go:10:8: interface contains type constraints

Go build failed.

Go相关问答推荐

追加一个字节数组的分配比2个字节数组的分配要少得多

消费者在NAT中是如何实现的

在Golang中,@LATEST和@UPGRADE特殊查询有什么不同?

Go:拆分一个由逗号分隔的键/值对字符串,并在给定的键/价值对中嵌入可能的逗号

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

当我使用 CircleCI 构建 Go Image 时,我得到runtime/cgo: pthread_create failed: Operation not allowed

使用Go和Operator SDK通过API调用设置Kubernetes Pods的安装步骤

使用Cookie身份验证的Gorilla Golang Websocket优化

在 Go sync.Map 中,为什么这部分实现不一致或者我误解了什么?

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

通过环境变量配置 OTLP 导出器

Dockerfile 问题 - 为什么找不到二进制 dlv - 没有这样的文件或目录

如何修改go gin的默认端口?我的 8080 端口正在使用中

Golang invopop jsonschema 使用 if/then/else

在我的情况下,如何以正确的方式测试方法?

Golang 数据库/sql 与 SetMaxOpenConns 挂起

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

Go:用于 XML 解码的嵌套 struct 中的提升字段

防止在 Go 公用文件夹中列出目录

Go 错误处理、类型断言和 net package包