Go语言单独实例化接口报错,数组形式可行的原因咨询
为什么Go里单独实例化接口会报错,但接口数组不会?
先明确Go的核心规则:接口是抽象类型,不能直接实例化,但可以把实现了接口的具体类型值赋值给接口变量,接口数组的写法本质是后者的合法应用。
先看报错的写法
st: Flag{// 不允许 &StringFlag{Name: ""}, }
这里试图用Flag{...}这种复合字面量直接创建接口实例,这是Go不允许的。接口本身只是方法签名的集合,没有自己的字段和内存布局,它没法直接被初始化——你得给它一个实现了该接口的具体类型的值,比如改成下面这样就合法:
st: &StringFlag{Name: ""},
因为*StringFlag实现了Flag接口要求的所有方法,Go会自动把它转换成Flag接口类型赋值给变量。
再看合法的接口数组写法
st: []Flag{// 允许 &StringFlag{Name: ""}, },
这里的[]Flag{...}是创建一个元素类型为Flag的切片。当你把&StringFlag{}放进切片时,Go会自动把这个具体类型值转换成Flag接口类型,再存入切片。这个过程完全符合规则:接口变量可以存储任何实现它的具体类型值,切片只是把多个这样的接口变量打包在一起而已。
简单总结:
- 不能直接用
接口类型{...}初始化接口,因为接口是抽象的,没有具体实现 - 接口数组/切片的初始化,本质是把多个实现了接口的具体类型值,转换为接口类型后存入容器,这是合法的
内容的提问来源于stack exchange,提问作者Matio
相关产品推荐
相关产品推荐

