struct&Method
Go通过类型别名和结构体的形式支持用户自定义类型。
结构体是复合类型。通过new来创建
组成结构体类型的数据称为字段。
type identifier struct {
field1 type1
field2 type2
...
}
在结构体的指针和结构体引用中,调用结构体内的字段都使用选择器(.)就是这个点。。。。叫结构体。。。
混合字面量语法new一个结构体对象
&struct{a,b,c}底层用的还是new()
new(Type)和&Type{}是等价的。
初始化方法
intr := Interval{0, 3} (A)
intr := Interval{end:5, start:1} (B)
intr := Interval{end:5} (C)
Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的,即使结构体中嵌套有其他的结构体
给结构体的字段添加标签:
type Num struct {
a int "I am a"
b int "I am b"
c int "I am c"
}
匿名字段:
只有类型没有字段名(此时类型就是字段名)
type Num struct {
a int "I am a"
b int "I am b"
c int "I am c"
int "I ma int"
}
内嵌结构体
结构体也是一种数据类型,所以它也可以作为一个匿名字段来使用
(继承机制)
当外层结构体和内嵌结构体不冲突时:
内嵌结构体的所有字段和方法都会被继承到外层结构体
当外层结构体和内嵌结构体命名冲突时。
内嵌结构体的字段被隐藏
内嵌结构体的方法被隐藏
但是当字段被隐藏,方法没有重名没有隐藏的话,方法内使用的指针是内嵌结构体对象的字段(就是那个被隐藏的)但是字段没有被隐藏,方法被隐藏的话,调用的字段也是父类的那个字段。(总的来说,方法是谁的就用谁的字段。)
(结构体是一个值类型、不是引用类型,所以传递结构体的时候使用的是拷贝)
方法:(方法是作用在接收者上的一个函数)
接收者必须是对应的结构体类型的引用或者指针。
方法定义
func (a *denseMatrix) Add(b Matrix) Matrix
func (a *sparseMatrix) Add(b Matrix) Matrix
接收者不能是一个接口类型,因为接口是一个抽象定义,所有的东西都是抽象的未完成的。
接收者也不能是一个指针类型。但是可以是任何其它允许类型的指针。
(可以是一个指针,但是不可以是一个指针类型的值)
类型和作用在它上面的方法必须在同一包内定义。
对于struct来说,struct的别名首字母大写表示外部包可以使用,但是字段没有大写则外部包就不能看到,所以,如果要是外部包可以看到字段,也需要大写。方法也是
类型的String()方法,被fmt.print等使用。