一 基本定义
type T1 struct { //定义结构体T1 e,f string //相同属性的字段可以合并写在一行 } type Test(T大写代表能跨包调用) struct { //定义结构体T2 嵌套T1 b c int, d *T1 //嵌套结构图常见于嵌套结构图类型的指针
e T1
} tt=Test{d:&T1{}}//嵌套指针实例化
tt=Test{d:T1{}}//嵌套对象实例化
tt.d.e="1123"//调用嵌套结构体的属性 tt.b=3//调用本身结构体的属性
二 匿名结构体-没有结构体名称
a5 := struct{ // 匿名结构体,定义并初始化 name string height float32 }
三 空结构体-空结构体即使没有属性也可以拥有方法
type a struct { }
四 传递
- 结构体对象作为函数参数传递是值拷贝,在函数内部操作不影响外部结果 对象
- 结构体指针作为函数参数传递是地址拷贝,在函数内部操作影响外部结果 指针
- 你如果想改变构体实例化对象的数据的值,就传递指针,如果不想改变结构体对象的值,就传递对象
五 结构体构造函数
构造函数的核心有2点 1 是必须要内部实现实例化 2 是通常返回指针类型,所以实例化要取地址&
func newInstanceKey(hostname string, port int, resolve bool) (instanceKey *InstanceKey, err error) {//构造函数
if hostname == "" {
return instanceKey, fmt.Errorf("NewResolveInstanceKey: Empty hostname")
}
instanceKey = &InstanceKey{Hostname: hostname, Port: port}//结构体指针初始化
if resolve {
instanceKey, err = instanceKey.ResolveHostname()//调用解析函数
}
return instanceKey, err//返回结构体对象
}
六 总结-整个流程
- type定义结构体
- newfunction 定义结构体构造函数
- (struct_a(可用this关键字代替) *结构体)function()定义方法并和结构体绑定
七 结构体切片
type Test struct { Value int } var slice *[]Test //定义结构体切片 func buildStruct(count int)*[]Test{ //定义函数返回结构体切片 slice := make([]Test,0) for i:=0;i<count;i++ { t := Test{Value:i} slice = append(slice,t)//追加元素 } return &slice//返回切片地址 }