Go结构体
Go结构体
定义
type user struct {
age int
name string
}
初始化
//方式1 new方式,返回指针类型*T
u2 := new(user)
//方式2 var的方式,返回T类型,里面的都是0值,如果里面还有个结构体,里面的结构体页初始为0值
var u1 user
u1.name="s"
u1.age=1
//方式3字面量的方式
u := user{}
u3 := &user{1, "zz"}
u3 := &user{}//等价于new(T)
u4 := user{
name: "s",
age: 1,//其中可以省略其中一个参数
}
u5 := user{
"s",
1,//必须和属性一一对应,并且不能少其中任何一个
}
方法与接收器
在go中,方法是有特定接收器的函数,接收器可以是任意类型而不仅仅是结构体
func (recipient recipentType) methodName(params)(return params){
function body
}
接收器有两种类别,分别是指针类型的接收器和非指针类型的接收器,他们在使用时会产生不同的效果。
指针类型的接收器传递的是类型的指针,指针操作的是接收器的内存区域,而非指针类型的接收器传递的是方法调用时接收器的一份值拷贝,所以对接收器的成员改变并不会影响到原接收器。
当接收器占用内存较大或者需要对原接收器的成员属性进行修改时,建议采用指针类型接收器;
如果接收器占用内存较小,且方法对其仅需要只读功能,可以采用非指针接收器。
func (u user) printName() {
fmt.Print(u.name)
//u.age=2//修改对原接收器并不会改变
}
func (u *user) changeName(s string) {
u.name = s
}
内嵌和组合
type Wheel struct {
shape string
}
//可以理解为继承
type Car struct {
Wheel//不指定属性名,只能出现一个Wheel
Name string
}
//也可以理解为对象
type Car struct {
a Wheel
b Wheel
Name string
}
组合可以理解为多继承
type Swimming struct{}
type Flying struct{}
func (swim *Swimming) swim() {
fmt.Print("游泳特性")
}
func (fly *Flying) fly() {
fmt.Print("飞行属性")
}
type WildDuck struct {
Swimming
Flying
}
type HomeDuck struct {
Swimming
}
func main(){
wildDuck := WildDuck{}
homeDuck := HomeDuck{}
wildDuck.fly()
wildDuck.swim()
homeDuck.swim()
}