一。定义:
1. type:定义一个新的数据类型
2.struct:这个数据类型是结构体
二。调用及赋值:
1. 使用new
使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:var t *T = new(T)
,如果需要可以把这条语句放在不同的行(比如定义是包范围的,但是分配却没有必要在开始就做)。
type T struct { a int b int } //方式一 var t T //方式二 var t *T //方式三 t = new(T)
写这条语句的惯用方法是:t := new(T)
,变量 t
是一个指向 T
的指针,此时结构体字段的值是它们所属类型的零值。
声明 var t T
也会给 t
分配内存,并零值化内存,但是这个时候 t
是类型T。
在这两种方式中,t
通常被称做类型 T 的一个实例(instance)或对象(object)。
2. 初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下:
ms := &struct1{10, 15.5, "Chris"} // 此时ms的类型是 *struct1 或者: var ms struct1 ms = struct1{10, 15.5, "Chris"}
混合字面量语法(composite literal syntax)&struct1{a, b, c}
是一种简写,底层仍然会调用 new ()
,这里值的顺序必须按照字段顺序来写。在下面的例子中能看到可以通过在值的前面放上字段名来初始化字段的方式。表达式 new(Type)
和 &Type{}
是等价的。
时间间隔(开始和结束时间以秒为单位)是使用结构体的一个典型例子:
type Interval struct { start int end int } 初始化方式: intr := Interval{0, 3} (A) intr := Interval{end:5, start:1} (B) intr := Interval{end:5} (C)
在(A)中,值必须以字段在结构体定义时的顺序给出,& 不是必须的。(B)显示了另一种方式,字段名加一个冒号放在值的前面,这种情况下值的顺序不必一致,并且某些字段还可以被忽略掉,就像(C)中那样。
三。结构体方法:结构体组合函数
1. 不在结构体内部,定义在结构体外部
2. 在普通函数名前加上结构体名和结构体数据类型
四。结构体指针
1. 如果一个结构体是指针类型,结构体内定义的变量应用,在调用其变量值的时候,可以不用*x的模式,直接用x.ss
2.可以用new(结构体类型)初始化一个结构体成指针
五。结构体内嵌结构体:实际就是继承(类的继承)
1. 继承了属性
2.继承了方法
六。值方法和指针方法:
1. 概念:
2. 区别:
七。其他: