Interface 在Go的结构中使用接口

Interface 在Go的结构中使用接口,interface,struct,go,Interface,Struct,Go,在试图理解围棋时,我在websocket.Go(截取)中遇到了这段代码: 在Conn类型中,frameHandler单独站在那里?没有名字的接口? 稍后在代码中,他们甚至尝试检查较差的接口是否为nil: Conn(a).frameHandler == nil 我自己的猜测是,结构中的frameHandler是一个与frameHandler接口匹配的类型,并且在该类型之上将具有名称frameHandler。这是正确的吗?呵呵,总之是有趣的语言。这句话: frameHandler 大致相

在试图理解围棋时,我在
websocket.Go
(截取)中遇到了这段代码:

在Conn类型中,
frameHandler
单独站在那里?没有名字的接口? 稍后在代码中,他们甚至尝试检查较差的接口是否为nil:

Conn(a).frameHandler == nil
我自己的猜测是,结构中的
frameHandler
是一个与frameHandler接口匹配的类型,并且在该类型之上将具有名称
frameHandler
。这是正确的吗?呵呵,总之是有趣的语言。

这句话:

    frameHandler
大致相当于:

    frameHandler frameHandler
其中,
frameHandler
既是字段的名称,也是字段的类型。此外,它将
frameHandler
的所有字段和方法添加到
Conn
,因此如果
Conn
Conn
,则
Conn.WriteClose(0)
表示
Conn.frameHandler.WriteClose(0)

正如它所说:

用类型声明但没有显式字段名的字段是匿名字段(俗称嵌入式字段)。此类字段类型必须指定为类型名称
T
或指向非接口类型名称
*T
的指针,并且
T
本身可能不是指针类型。非限定类型名用作字段名

// A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4 struct { T1 // field name is T1 *T2 // field name is T2 P.T3 // field name is T3 *P.T4 // field name is T4 x, y int // field names are x and y }
好吧,那就是我所怀疑的。你也能这样做吗
myInt
将等于
myInt-myInt
?啊!!你的加入正好回答了我的第二个想法。谢谢你的帮助。语言当然有它有趣的方式。还要注意的是,frameHandler的方法自动也是Conn的方法。@AnschelSchaffer-Cohen:这一点很好。我的回答并不是说这两种形式是等价的,因为第一种形式比第二种形式更有效。我会考虑编辑它。 // A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4 struct { T1 // field name is T1 *T2 // field name is T2 P.T3 // field name is T3 *P.T4 // field name is T4 x, y int // field names are x and y } struct { T // conflicts with anonymous field *T and *P.T *T // conflicts with anonymous field T and *P.T *P.T // conflicts with anonymous field T and *T } // A struct corresponding to the TimeStamp protocol buffer. // The tag strings define the protocol buffer field numbers. struct { microsec uint64 "field 1" serverIP6 uint64 "field 2" process string "field 3" }