学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。

转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉!

本文永久更新地址:https://my.oschina.net/bysu/blog/3040138

【若要到岸,请摇船:开源中国 不最醉不龟归】

很多年前学习了一下goland,但是没有怎么开始就放下了,这次贴了心学到底。看了一下,觉得goland比较重要的部分就是:1.函数;2.结构体;3.接口;4.并发。

每次要学什么东西之前,我就会狂搜罗一大堆相关的书籍及教程,然后从中挑选一两本或者各教程中某部分来看。这次也不例外,看了很多本关于goland的书,觉得还是《Go语言从入门到进阶实战》比较不错,比较适合我这种菜鸡(连菜鸟都不算)的人,并且里面的例子确实挺好的。好了,废话不多说,下面的内容就是看《Go语言从入门到进阶实战》这本书接口这部分的笔(抄)记(袭),感兴趣的可以买来学习一下。

---------------------------------------

Go语言通过用户自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。Go语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。

Go语言中的类型可以被实例化,使用new或“&”构造的类型实例的类型是类型的指针。

结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性:
1.字段拥有自己的类型和值;

2.字段名必须唯一;

3.字段的类型也可以是结构体,甚至是字段所在的结构体的类型。

1.定义结构体

Go语言的关键字type可以将各种基本类型定义为自定义类型,基本类型包括整型、字符串、布尔等。结构体是一种复合的基本类型。通过type定义为自定义类型后,使结构体更便于使用。

结构体的定义格式如下:

type 类型名 struct{

字段1    字段1类型

字段2     字段2类型

...

}

3330e4b8efc2ca7c6b1ae043c8664e133e1.jpg

2. 实例化结构体——为结构体分配内存并初始化

结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存。因此必须在定义结构体并实例化后才能使用结构体的字段。

实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。

Go语言可以通过多种方式实例化结构体,根据实际需要可以选用不同的写法。

2.1 基本的实例化形式

结构体本身是一种类型,可以像整型、字符串等类型一样,以var的方式声明结构体即可完成实例化。

基本实例化格式如下:

var  ins  T

其中:T为结构体类型

           ins为结构体的实例。

用结构体表示的点结构(Point)的实例化过程请参见下面的代码:

db491a437a9f22bfb70f82e916601528690.jpg

上面例子中,使用“.”来访问结构体的成员变量,如p.X和p.Y等。结构体成员变量的赋值方法与普通变量一致。

2.2 创建指针类型的结构体

Go语言中,还可以使用new关键字对类型(包括接头体、整型、浮点数、字符串等)进行实例化,结构体在实例化后会形成指针类型的结构体。

使用new的格式化如下:

ins := new(T)

其中:T为类型,可以是结构体、整型、字符串等。

           ins:T类型被实例化后保存到ins变量中,ins的类型为*T,属于指针。

Go语言让我们可以像访问普通结构体一样使用“.”访问结构体指针的成员。

下面的例子定义了一个玩家(player)的结构,玩家拥有名字、生命值和魔法值,实例化玩家(player)结构体后,可对成员进行赋值,代码如下:

8204bd403aa680c366bb8969117ce5fb2f8.jpg

经过new实例化的结构体实例在成员赋值上与基本实例化的写法一致。

提示:在C/C++语言中,使用new实例化类型后,访问其成员变量时必须使用“->”操作符。

2.3 取结构体的地址实例化

在Go语言中,对结构体进行“&”取地址操作时,视为对该类型进行一次new的实例化操作。取地址格式如下:

ins := &T{}

其中:T表示结构体类型

           ins为结构体的实例,类型为*T,是指针类型。

下面使用结构体定义一个命令行指令(Command),指令中包含名称,变量关联和注释等。对Command进行指针地址的实例化,并完成赋值过程,代码如下:

6f462a9898e19422fdee978139b7630eac7.jpg

取地址实例化是最广泛的一种结构体实例化方式。可以使用函数封装上面的初始化过程。

6f0da9b63c6fd4431ca60eb31f65ccc6660.jpg

3 初始化接头体的成员变量

结构体在实例化时可以直接对成员变量进行初始化。初始化有两种形式:一种是字段“键值对”形式及多个值的列表形式。键值对形式的初始化适合选择性填充字段较多的结构体;多个值的列表形式适合填充字段较少的结构体。

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)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值