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 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中的多态,就是就是用接口来实现的
关于结构体中的继承做了一些总结
当我们直接用变量访问某个字段时,其流程如下
编译器会先在当前结构体上下查找对应的字段或属性,如果有,则直接调用显示
如果没有,则向匿名结构体中查询相对应的字段,如果有,则显示,如果还没有,则报错
type A struct{
name string
}
type D struct{
a A //有名结构体,这就是结合关系了
}
#如果有组合结构体中的属性,就需要带上结构体名
var d D
d.a.name #调用结构体A中的name
页面更新:2024-03-18
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号