您的位置 首页 golang

go中struct结构体的知识点总结

1.结构体的定义

 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。类似于别的语言中的类,对象等
  

2.结构体的定义

 type 结构体名称 struct{
field1 type  #结构体字段或属性,一般是基本数据类型,数组 也 可以是引用类型
field2 type
}
#在创建一个结构体变量后,如果没有字段赋值,则会有一个默认值,布尔类型为false,数值类型为0
字符串 "",数组类型的默认值和它的元素类型有关,
指针,map,slice 的默认值为nil  ,原因是还没有分配空间导致
#结构体是值类型,它遵循值类型拷贝  

3. 访问结构体

  • 直接声明
 var p1 Person  
  • {}直接声明
 var p Person=Person{}  
  • &指针方式使用
 var p *Person =new(Person)
由于p是一个指针,正常的赋值应该是(*p).Name="test" 
但是go为了方便使用,在底层做了处理,所以也可以p.Name="test"这样使用  
  • 指针和{}
 var p *Person=&Person{} #这里也是返回的结构体指针  

小结:

  • 结构体的所有字段在内存中连续的
  • 结构体是用户自定义的,和 其他类型进行转换的时候需要有完全相同的字段(名字,个数,类型)
  • 结构体进行type重新定义时,go认为是新的数据类型,但是相互间可以转换
  • 结构体的每个字段,可以写上一个tag,该tag可以 通过反射机制获取,常见的场景是序列化和反序列化
 type p struct{
name string `json:name`
age int `json:age`
}  

4.结构体的方法的声明和使用

 type T struct {
name string
}
func(t,T )test(){
....
}
# func(t,T)test()表示这个T结构体有一个方法,叫test
#(t,T) 是test方法与T类型绑定的
#这个test 方法只能通过 person类型的变量来调用,不能直接调用
#由于结构体是值传递,所以想修改结构体里的值的话,可以通过指针来处理
#如果一个类型实现了String这个方法,那么fmt.Println默认会调用这个 变量的String方法进行输出  

小技巧:

 1.如果不是结构体不能在被外包调用,如何解决?  
  可以利用工厂模式,在结构体所在的包中创建一个函数用于返回结构体白指针,
  这样就可以间接的访问结构体了,如下图,结构体只能在本包使用,
  如果在外包可以调用的话,需要利用工厂模式
2.如果字段是小写的,也可以用同样的方法,如SetVal1,设置值,GetVal1()获取值  

5.关于go中的面向对象

 由于go中并没有class,所以面向对象是比较模糊的,可以把结构体看成class,
面向对象的三大特性,封装,继承,多态,在这不过多的说了,简单说:
go中的封装 就是把那些只能内部使用的属性,通过公开的方法对外提供访问,隐藏细节
go中继承  就是结构体的匿名嵌套
go中的多态,就是就是用接口来实现的  

关于结构体中的继承做了一些总结

  • 结构体是可以使用嵌套匿名结构体中的所有字段和方法
  • 匿名结构体字段访问可以简化
 当我们直接用变量访问某个字段时,其流程如下
编译器会先在当前结构体上下查找对应的字段或属性,如果有,则直接调用显示
如果没有,则向匿名结构体中查询相对应的字段,如果有,则显示,如果还没有,则报错  
  • 当结构体与匿名结构体有相同的方法或字段时,编译器采用就近访问原则,如果需要访问匿名结构体中的字段或方法,需要使用匿名结构体名来区分
  • 当结构体嵌入两个或多个匿名结构体时,如果两个匿名结构体有相同的方法和属性时,需要指定匿名结构体名称,否则会报错
  • 如果一个struct嵌套一个有名的结构体,则这咱模式就是组合关系,如果在访问组合的结构体中字段和方法时, 必须 要带上结构体的名字
 type A struct{
name string
}
type D struct{
a A  //有名结构体,这就是结合关系了
}
#如果有组合结构体中的属性,就需要带上结构体名
var d D
d.a.name  #调用结构体A中的name  
  • 嵌套匿名结构体后,可以在创建结构体变量时,直接指定各个匿名结构体字段的值

文章来源:智云一二三科技

文章标题:go中struct结构体的知识点总结

文章地址:https://www.zhihuclub.com/86547.shtml

关于作者: 智云科技

热门文章

网站地图