【问题标题】:Using an interface within a struct in Go在 Go 的结构中使用接口
【发布时间】:2012-02-23 12:41:59
【问题描述】:

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

type frameHandler interface {
    HandleFrame(frame frameReader) (r frameReader, err error)
    WriteClose(status int) (err error)
}

// Conn represents a WebSocket connection.
type Conn struct {
    config  *Config
    request *http.Request
    .
    .
    frameHandler
    PayloadType        byte
    defaultCloseStatus int
}

在 Conn 类型中,frameHandler 单独存在?没有名字的界面? 稍后在代码中,他们甚至尝试检查糟糕的接口是否为 nil:

Conn(a).frameHandler == nil

我自己的猜测是结构中的frameHandler 是一种与frameHandler 接口匹配的类型,并且在此之上将具有名称frameHandler。它是否正确?呵呵,好有趣的语言。

【问题讨论】:

    标签: interface struct go


    【解决方案1】:

    这一行:

        frameHandler
    

    大致相当于这个:

        frameHandler frameHandler
    

    因为frameHandler 既是字段的名称,也是它的类型。另外,它将frameHandler的所有字段和方法添加到Conn,所以如果connConn,那么conn.WriteClose(0)就是conn.frameHandler.WriteClose(0)

    正如the Go Programming Language Specification 所说:

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

    // 具有 T1、*T2、P.T3 和 *P.T4 类型的四个匿名字段的结构
    结构{
        T1 //字段名是T1
        *T2 // 字段名称为 T2
        P.T3 // 字段名称为 T3
        *P.T4 // 字段名称为 T4
        x, y int // 字段名是 x 和 y
    }
    以下声明是非法的,因为字段名称在结构类型中必须是唯一的:
    struct {
        T // 与匿名字段 *T 和 *P.T 冲突
        *T // 与匿名字段 T 和 *P.T 冲突
        *P.T // 与匿名字段 T 和 *T 冲突
    }
    匿名字段的字段和方法(§Method 声明)被提升为结构的普通字段和方法(§Selectors)。以下规则适用于名为 S 的结构类型和名为 T 的类型:
    • 如果S 包含匿名字段T,则 S 的方法集包括 T 的方法集。
    • 如果S 包含匿名字段*T,则 S的方法集包含*T的方法集 (它本身包括T的方法集)。
    • 如果S 包含匿名字段T*T*S 的方法集包括 *T 的方法集(它本身包括方法 一组T)。
    字段声明后面可以跟一个可选的字符串文字tag,它成为相应字段声明中所有字段的属性。标签通过反射界面可见,但在其他方面被忽略。
    // 一个对应于TimeStamp协议缓冲区的结构体。
    // 标签字符串定义协议缓冲区字段编号。
    结构{
        微秒 uint64 “字段 1”
        serverIP6 uint64 “字段 2”
        处理字符串“字段 3”
    }

    【讨论】:

    • 好吧,那正如我所怀疑的那样。你可以对类型也这样做吗? myInt 是否等于 myInt myInt?啊!您的添加刚刚回答了我的第二个想法。
    • 感谢您的帮助。这种语言肯定有它有趣的方式。
    • 还要注意frameHandler的方法自动也是Conn的方法。
    • @AnschelSchaffer-Cohen:好点。我的回答并不是说这两种形式是等价的,因为第一种形式比第二种形式做得更多。我会看看编辑它。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多