为什么我不能将 *Struct 分配给 *Interface?
技术问答
338 人阅读
|
0 人回复
|
2023-09-12
|
我刚刚完成Go tour,我对指针和界面感到困惑。为什么这个 Go 代码无法编译?! v! F" \% a' ~3 `
package maintype Interface interface {}type Struct struct {}func main() var ps *Struct var pi *Interface pi = ps _,_ = pi,ps}
* p; [% U. K5 R- C- Y. h 即如果Struct是一个Interface,为什么不是*Struct一个*Interface?
/ b) _1 Q% U9 P7 }: ]3 V我得到的错误信息是:. G6 N# p4 |. S. h, ?, U
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment: *Interface is pointer to interface,not interface& N; `! u6 u9 ~: ]0 U
5 v% w% K) @4 ~$ k& j# ?1 z6 F& P 解决方案: 4 A6 r; \7 B. u% f
当你有一个实现接口的结构时,指向结构的指针会自动实现接口。这就是为什么你从来没有*SomeInterface使用函数原型的原因是它不会向 添加任何内容SomeInterface,而且你不需要在变量声明中使用这种类型。
& {9 ?' K; M* ~- {3 e6 {* y$ a3 c接口值不是特定结构的值(因为它有可变大小,这是不可能的),而是指针(更准确地说是指向结构和类型的指针)。Russ Cox这里准确描述了它:
9 ]2 ^* e; g9 y/ V2 f% ~接口值表示为两个字对,给出一个指向存储在接口中的类型信息的指针和一个指向相关数据的指针。
8 e* i$ q) r1 t8 H8 ~! R; o9 F; `/ m- F1 o7 `9 L
这就是为什么Interface,而不是*Interface 结构保存指针的正确类型Interface。
" M a0 k6 d# e. L所以你必须简单地使用它7 |/ S: I% M. n+ [/ j) U5 s v9 Q6 v
var pi Interface
: [( B& ?9 J8 _( K |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|
|
|
|
|