Go结构体

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()
}

   转载规则


《Go结构体》 朱林刚 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Go 反射 Go 反射
Go 反射Go 反射通过反射可以获取丰富的类型信息,并可以利用这些类型信息做非常灵活的工作。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程
2021-11-18
下一篇 
Go switch 语句 Go switch 语句
switch 语句switch 语句不需要breakgo会帮你隐式break掉。 case表达式的结果类型的转换要求case表达式的结果能转换为switch表示式结果的类型 并且如果switch或case表达式的是无类型的常量时,会被自动转
2021-11-18
  目录