golang中struct

前面已经介绍的数组,slice,map有一定的相同之处,即处理的都是相同类型的元素,map中的key和value属于相同的类型,但如果要把多个类型的元素放到一起进行处理,则要使用go语言为我们提供的数据结构struct

 struct非常适合定义一个有意义的对象,可以用于定义属性和方法,这和c语言的结构体,java,class类有些相似。当然struct肯定不是class

 struct也是复合类型,而非引用类型,复合类型和引用类型是有区别的,复合类型是值传递,引用类型是引用传递。

type  Person  strcuct  {
   name  string
   gender int //string
   age  int 
}

上述代码简单定义了一个struct 包含三个成员,也可以说三个字段或者属性,在语法上,可以吧同类型的元素写在一行,通常建议一行一个成员比较好。除了类型以外,在定义结构体的时候还可以定义对应的数据库字段和json关键字。

  可以定义,没有任何成员的空结构体struct {},在并发编程中,channel之间的通信可以用空结构体作为信号量。

在介绍了struct的定义后,接着介绍struct的使用,我们可以定义一个所有成员都取默认值的struct变量

var  p1  Persion

p2 := Persion{ "Scott",1,30}  也可以在定义变量的同时赋予初始值

这种赋值方式要求赋值顺序一定要和struct成员的定义顺序保持一致,现任这对于写代码非常不方便,

p3 :=Persion{name:"lili",gender:1,age:30}

这种方式可以解决struct比较复杂时的赋值问题,也是比较常见的方式,注意,在这种方式里,person和p3赋值语句是在一个包内完成的,如果要在其他包使用persion创建变量并赋值则会报错,因为成员首字母全部为小写

struct成员的可见性是通过首字母大小写控制的,首字母小写仅本包可见,首字母大写则包外可见

如果我们要访问struct变量内的具体某个成员,则可以使用p3.name 类似的写法

这里请注意struct内成员的可见性,上面的代码仅当与Person的定义在同一包内时才不会报错。结构体作为复合结构也是值传递的,所以在使用结构体的时候一定要注意与指针的结合,使用指针来传递可以提高效率,避免数组的赋值。

 结构体指针的定义非常简单,就是在struct类型前面加上* var  pp *Person

pp就是Person这个struct指针类型的变量,上面的例子中pp是nil值,结构体指针本质上就是指针,所以其默认值是nil,如果在上例中调用pp.name则会报错,因为pp此时还没初始化

结构化指针必须初始化以后才可以使用,因为如果仅仅声明结构体指针类型变量,其默认值是nil

很多时候我们都需要先初始化一个struct,然后将其地址引用返回给一个结构体指针变量,故而go语言专门提供了一个new函数

pp  := new(Person)

pp.name = "lili"

这里pp还是指向struct的指针,但new函数已经为我们初始化了一个结构体,再继续为结构体的name赋值就不会报错

 

 首先定义了一个结构体 struct,注意属性都是首字母大写,说明是包外可访问的

AddAgePlus采用struct指针作为参数,属性Age+1 以后,没有返回值

先创建p1变量,然后p2接收Addage函数的返回值,接着打印。p1没有任何改变,p2的Age属性+1。说明AddAgefunc 是值传递的,其函数体内的操作并没有对p1产生影响。

  前面介绍了make函数,本节又介绍了new函数,此处将二者对比。make函数用于slice,map,channel进行内存分配,它返回的不是指针,而是类型本身。new函数返回初始化的类型对应的指针,new函数主要用于struct初始化中。

组合

struct是golang中最常用的数据类型,go是支持面向对象编程的,但是没有继承。那么go是通过什么方法实现类似继承的效果呢,那就是通过struct的组合,go语言推荐使用struct组合来达到代码复用的效果,并以此实现类似继承的功能

struct组合涉及多个struct,一个struct可以包含有其他struct,以此达到复用效果。

虽然struct可以含有其他struct但是不可以含有自身,也就是说一个struct的成员不可以是本struct。不过struct内的成员可以是指向自己的指针

 先定义了一个struct  person

然后定义Employee struct ,里面包含了Person结构,吧person作为Emplloyee的一个字段

定义了一个student  struct ,这是匿名字段的用法,只需要写类型即可,当要访问内部结构体的字段时,不需要按照完整路径去写,在结构体下直接访问内部结构体的字段即可。也可以带上匿名字段。

其实struct的用法更为灵活,可以在定义的时候使用tags,是struct字段与json数据库建立关系。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值