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())
}
posted @ 2020-11-02 17:33  HachikoT  阅读(77)  评论(0编辑  收藏  举报