寫在前面:如有侵權,請發郵件by.su@qq.com告知。併發
本文永久更新地址:https://my.oschina.net/bysu/blog/3040138app
【若要到岸,請搖船:開源中國 不最醉不龜歸】函數
不少年前學習了一下goland,可是沒有怎麼開始就放下了,此次貼了心學到底。看了一下,以爲goland比較重要的部分就是:1.函數;2.結構體;3.接口;4.併發。佈局
每次要學什麼東西以前,我就會狂搜羅一大堆相關的書籍及教程,而後從中挑選一兩本或者各教程中某部分來看。此次也不例外,看了不少本關於goland的書,以爲仍是《Go語言從入門到進階實戰》比較不錯,比較適合我這種菜雞(連菜鳥都不算)的人,而且裏面的例子確實挺好的。好了,廢話很少說,下面的內容就是看《Go語言從入門到進階實戰》這本書接口這部分的筆(抄)記(襲),感興趣的能夠買來學習一下。學習
---------------------------------------spa
Go語言經過用戶自定義的方式造成新的類型,結構體是類型中帶有成員的複合類型。Go語言使用結構體和結構體成員來描述真實世界的實體和實體對應的各類屬性。.net
Go語言中的類型能夠被實例化,使用new或「&」構造的類型實例的類型是類型的指針。命令行
結構體成員是由一系列的成員變量構成,這些成員變量也被稱爲「字段」。字段有如下特性:
1.字段擁有本身的類型和值;指針
2.字段名必須惟一;code
3.字段的類型也能夠是結構體,甚至是字段所在的結構體的類型。
Go語言的關鍵字type能夠將各類基本類型定義爲自定義類型,基本類型包括整型、字符串、布爾等。結構體是一種複合的基本類型。經過type定義爲自定義類型後,使結構體更便於使用。
結構體的定義格式以下:
type 類型名 struct{
字段1 字段1類型
字段2 字段2類型
...
}
結構體的定義只是一種內存佈局的描述,只有當結構體實例化時,纔會真正地分配內存。所以必須在定義結構體並實例化後才能使用結構體的字段。
實例化就是根據結構體定義的格式建立一份與格式一致的內存區域,結構體實例與實例間的內存是徹底獨立的。
Go語言能夠經過多種方式實例化結構體,根據實際須要能夠選用不一樣的寫法。
結構體自己是一種類型,能夠像整型、字符串等類型同樣,以var的方式聲明結構體便可完成實例化。
基本實例化格式以下:
var ins T
其中:T爲結構體類型
ins爲結構體的實例。
用結構體表示的點結構(Point)的實例化過程請參見下面的代碼:
上面例子中,使用「.」來訪問結構體的成員變量,如p.X和p.Y等。結構體成員變量的賦值方法與普通變量一致。
Go語言中,還可使用new關鍵字對類型(包括接頭體、整型、浮點數、字符串等)進行實例化,結構體在實例化後會造成指針類型的結構體。
使用new的格式化以下:
ins := new(T)
其中:T爲類型,能夠是結構體、整型、字符串等。
ins:T類型被實例化後保存到ins變量中,ins的類型爲*T,屬於指針。
Go語言讓咱們能夠像訪問普通結構體同樣使用「.」訪問結構體指針的成員。
下面的例子定義了一個玩家(player)的結構,玩家擁有名字、生命值和魔法值,實例化玩家(player)結構體後,可對成員進行賦值,代碼以下:
通過new實例化的結構體實例在成員賦值上與基本實例化的寫法一致。
提示:在C/C++語言中,使用new實例化類型後,訪問其成員變量時必須使用「->」操做符。
在Go語言中,對結構體進行「&」取地址操做時,視爲對該類型進行一次new的實例化操做。取地址格式以下:
ins := &T{}
其中:T表示結構體類型
ins爲結構體的實例,類型爲*T,是指針類型。
下面使用結構體定義一個命令行指令(Command),指令中包含名稱,變量關聯和註釋等。對Command進行指針地址的實例化,並完成賦值過程,代碼以下:
取地址實例化是最普遍的一種結構體實例化方式。可使用函數封裝上面的初始化過程。
結構體在實例化時能夠直接對成員變量進行初始化。初始化有兩種形式:一種是字段「鍵值對」形式及多個值的列表形式。鍵值對形式的初始化適合選擇性填充字段較多的結構體;多個值的列表形式適合填充字段較少的結構體。
3.1 使用「鍵值對」初始化結構體
結構體可使用「鍵值對」(Key value pair)初始化字段,每一個「鍵」(key)對應結構體中的一個字段。鍵的「值」(Value)對應字段須要初始化的值。
....
....
....
事件示例
package main import "fmt" var eventByName = make(map[string][]func(interface{})) //註冊事件 func RegisterEvent(name string,callback func(interface{})){ list := eventByName[name] list = append(list,callback) eventByName[name] = list } //調用事件 func CallEvent(name string,param interface{}){ list := eventByName[name] for _,callback := range list{ callback(param) } } type Actor struct { } func (a *Actor) OnEvent(param interface{}){ fmt.Println("actor event:",param) } func GlobalEvent(param interface{}){ fmt.Println("global event:",param) } func main(){ a := new(Actor) RegisterEvent("OnSkill",a.OnEvent) RegisterEvent("OnSkill",GlobalEvent) CallEvent("OnSkill",1) }