写在前面:如有侵权,请发邮件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) }