Golang學習筆記:語言規範之類型(續)

類型(續)

指針類型

指針類型表示所有給定類型的指針變量,也稱爲基礎類型的指針,默認未初始化的指針類型值爲nil

PointerType = "*" BaseType .
BaseType    = Type .

*Point
*[4]int

函數類型

函數類型表示擁有相同參數和返回值類型的函數,未初始化的函數類型變量的值爲nil,定義如下

FunctionType   = "func" Signature .
Signature      = Parameters [ Result ] .
Result         = Parameters | Type .
Parameters     = "(" [ ParameterList [ "," ] ] ")" .
ParameterList  = ParameterDecl { "," ParameterDecl } .
ParameterDecl  = [ IdentifierList ] [ "..." ] Type .

參數或返回值可以有零個或多個。還可以通過... 來指定變參類型,表示可傳遞0個或n個參數。

func()
func(x int) int
func(a, _ int, z float32) bool
func(a, b int, z float32) (bool)
func(prefix string, values ...int)
func(a, b int, z float64, opt ...interface{}) (success bool)
func(int, int, float64) (float64, *[]int)
func(n int) func(p *T)

接口類型

接口類型表示一組方法的組合。接口類型的變量可以存儲引用任意類型T,只要T的方法都實現該接口的方法,這樣的T類型可以被稱爲實現了該接口,未初始化的接口類型變量值爲nil

InterfaceType   = "interface" "{" { MethodSpec ";" } "}" 
MethodSpec       = MethodName Signature | InterfaceTypeName 
MethodName         = identifier
InterfaceTypeName  = TypeName 

接口的所有方法必須是唯一的非空白名稱

// A simple File interface
interface {
    Read(b Buffer) bool
    Write(b Buffer) bool
    Close()
}

任意的一個或多個類型都可實現此接口,例如T類型

func (p T) Read(b Buffer) bool { return … }
func (p T) Write(b Buffer) bool { return … }
func (p T) Close() { … }

空類型不包含任何方法,因此所有的類型都實現了空接口

interface{}

接口可以嵌套
接口T可以使用接口E作爲嵌入字段,則T隱式的包含E的所有方法

type Locker interface {
    Lock()
    Unlock()
}
type File interface {
    ReadWriter  // same as adding the methods of ReadWriter
    Locker      // same as adding the methods of Locker
    Close()
}

切記:接口不可循環嵌套

// illegal: Bad cannot embed itself
type Bad interface {
    Bad
}

Map(K-V)類型

Map類型表示K類型到V類型的映射,未初始化的Map類型默認爲nil

MapType     = "map" "[" KeyType "]" ElementType .
KeyType     = Type .

在key類型上需要執行操作數的比較運算(==!=),因此key類型不能是函數類型、map類型、slice類型。如若key是一個接口類型,則key必須要定義一個動態值才能執行比較運算,否則會造成一個運行時panic 異常。

map[string]int
map[*T]struct{ x, y float64 }
map[string]interface{}

可使用內置的函數len 來計算map的大小,delete 來移除元素
創建map時,用make 函數,並可指定其容量

make(map[string]int)
make(map[string]int, 100)

管道(Channel)類型

管道(Channel)類型通過發送和接收指定類型的值來實現通信,並以此提供一種機制來實現併發執行的功能。未初始化的值也是nil.

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType

<- 操作符指定了管道的發送和接收的方向,若沒有指定方向,則代表是雙向的,管道只能順序發送或接收。

chan T  // can be used to send and receive values of type T
chan<- float64  // can only be used to send float64s
<-chan int      // can only be used to receive ints

使用make 方法來創建管道

make(chan int, 100)

最後一個參數表示容量,可以省略。定義了該參數,表示此管道是一個緩衝管道,因此該管道只能存儲指定的大小的元素,當超出長度後,則會阻塞,直到goroutine從管道中讀取一些元素,騰出空間。

可用close 函數來關閉管道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章