Go中的结构体
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。就像Java中的类一样。
结构体的基本用法
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:
package main
import (
"fmt"
)
//定义结构体
type Person struct {
//定义属性
name string
Age int
}
//定义结构体的方法,与普通方法相比,在func与方法名之间加入方法所属的结构体类型,表示方法是这个类型的一个方法
func (p Person) test() {
fmt.Println(p.name)
fmt.Println(p.Age)
}
func main() {
//创建结构体变量,注意不是new
zhansan:=Person{name:"张三",Age:30}
//访问结构体成员
fmt.Println(zhansan.name)
fmt.Println(zhansan.Age)
//调用结构体方法
zhansan.test()
}
需要注意的是,结构体是值类型,不像Java的类是引用类型,因此将结构体作为函数参数时,修改不会改变结构体本身,如果希望修改则需要传入结构体指针。
package main
import (
"fmt"
)
//定义结构体
type Person struct {
//定义属性
name string
Age int
}
//定义结构体的方法,与普通方法相比,在func与方法名之间加入方法所属的结构体类型,表示方法是这个类型的一个方法
func (p Person) test() {
fmt.Println(p.name)
fmt.Println(p.Age)
}
func main() {
//创建结构体变量,注意不是new
zhansan:=Person{name:"张三",Age:30}
//调用结构体方法
zhansan.test()
//调用方法修改结构体属性
changeProperty(zhansan)
//再次打印
zhansan.test()
//调用函数传入结构体指针
changePropertyByPointer(&zhansan)
zhansan.test()
}
func changeProperty(p Person) {
p.name="李四"
}
func changePropertyByPointer(p *Person) {
p.name="李四"
}
运行结果:
张三
30
张三
30
李四
30
结构体组合
go不支持继承,但可以通过组合实现,更加简便
type Person struct {
Name string
}
func (p *Person) Introduce() {
fmt.Printf("Hi, I'm %s\n", p.Name)
}
type Saiyan struct {
//只写类型名,会自动将Person中的所有成员放入Saiyan中
Person
Power int
}
// 使用:
goku := &Saiyan{
Person: &Person{"Goku"},
Power: 9001,
}
goku.Introduce()
结构体Saiyan
有一个字段时Persion
类型。因此我们没有明确的给它一个字段名,我们可以间接的使用这个组合类型的字段和方法。然而,go编译器给会给该字段一个名字,认为这是完全有效的。
goku := &Saiyan{
Person: &Person{"Goku"},
}
//两者使用方式是等效的
fmt.Println(goku.Name)
fmt.Println(goku.Person.Name)
上面代码都将打印Goku
。