go结构体struct
定义结构体
type struct_variable_type struct {
member definition
member definition
...
member definition
}
比如
type person struct {
name string
age uint
}
访问结构体成员
无论是struct对象还是指针都是通过点号.
操作符访问结构体成员:
package main
import (
"fmt"
)
type person struct {
name string
age uint
}
func main() {
var p = person{"rancheng", 25}
var p2 = &p
fmt.Println(p.name, p.age)
fmt.Println(p2.name, p2.age)
}
方法
在Go语言中,将函数绑定到具体的类型中,则称该函数是该类型的方法,其定义的方式是在func与函数名称之间加上具体类型变量,这个类型变量称为方法接收器,如:
package main
import (
"fmt"
)
type person struct {
name string
age uint
}
func (p *person) isAdult() bool {
return p.age > 18
}
func main() {
var p = person{"rancheng", 25}
fmt.Println(p.isAdult())
}
注意事项:
- go中不支持重载,所以相同类型的方法名不能重复。
- struct结合它的方法就等价于面向对象中的类。只不过struct可以和它的方法分开,并非一定要属于同一个文件,但必须属于同一个包。
- 方法的receiver type并非一定要是struct类型,type定义的类型别名、slice、map、channel、func类型等都可以。但内置简单数据类型(int、float等)不行,interface类型不行。
继承(匿名组合)
在go中可以用匿名字段的方式实现继承,可以多继承,当出现二义性时需手动写明是用的哪个父类的方法或字段,这一点跟C++一样:
package main
import (
"fmt"
)
type P1 struct {
n int
}
func (p *P1) Num() int {
return p.n
}
type P2 struct {
n int
}
func (p *P2) Num() int {
return p.n
}
type Child struct {
P1
P2
n int
}
func (p *Child) Num() int {
return p.n
}
func main() {
p1 := P1{1}
p2 := P2{2}
c := Child{P1{1}, P2{2}, 1}
fmt.Println(p1.Num())
fmt.Println(p2.Num())
fmt.Println(c.Num())
}