在Go

2012-02-23 81 views
1

一个结构中使用的接口在试图理解去,我碰到了这段代码在websocket.go(剪断):在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 
} 

在康涅狄格州键入frameHandler看台上有一个人吗?没有名字的界面? 后来的代码,他们甚至尝试检查,如果穷人接口是零:

Conn(a).frameHandler == nil 

我自己的猜测是,在结构内的frameHandler是一种将frameHandler接口匹配,并且最重要的是将有名称frameHandler。它是否正确?无论如何,呵呵,有趣的语言。

回答

9

这条线:

frameHandler 

大致相当于此:

frameHandler frameHandler 
在于 frameHandler

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

由于the Go Programming Language Specification所言:

字段与类型声明,但没有明确的字段名称是匿名场(俗称嵌入式字段)。这种字段类型必须指定为类型名称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 
}
以下声明是非法的,因为字段名称在结构类型中必须是唯一的:
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 
}
匿名字段的字段和方法(§Method声明)被提升为结构(§Selectors)的普通字段和方法。以下规则适用名为 S结构类型和类型命名为 T
  • 如果S包含一个匿名字段TS的 方法集包括T的 方法集。
  • 如果S包含一个匿名字段*T,的S的 方法集包括*T 方法集合(其本身包括的T的方法集)。
  • 如果S包含一个匿名字段T*T,的*S该方法集合包括的*T的 方法集合(其本身包括方法 组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" 
}

+0

好的,那么它就像我怀疑的那样。你能像那样用类型来做吗? 'myInt'将等于'myInt myInt'?啊!你的加入只是回答了我的第二个想法 – ANisus 2012-02-23 12:48:03

+0

感谢您的帮助。该语言肯定有它有趣的方式。 – ANisus 2012-02-23 12:50:05

+2

另请注意,frameHandler的方法自动也是Conn。 – 2012-02-23 21:51:15