Go 编程基础 method 10

方法method

  • Go中虽然没有class 但依旧有method
  • 通过显示说明receiver来实现与某个类型的组合
  • 只能为同一个包中的类型定义方法
  • Reveiver 可以是类型的值或者指针
  • 不存在方法重载
  • 可以使用值或指针来调用方法, 编译器会自动完成转换
  • 从某种意义上说,方法是函数的语法糖. 因为receiver其实就是方法所接受的第一个参数(Method Value vs.Method Expression)
  • 如果外部结构和嵌入结构存在同名方法 则优先调用外部结构方法
  • 类型别名不会拥有底层类型所附带的方法
  • 方法可以调用结构中的非公开字段

给结构绑定方法

那么我们这里可一个给A B两个结构绑定2个方法

func main() {
    a := A{Name:"original a"}
    fmt.Println(a)
    a.Print()
    fmt.Println(a)

    b := B{Name:"original b"}
    fmt.Println(b)
    b.Print("change b")
    fmt.Println(b)
}

type A struct {
    Name string
}

func (a A) Print() {
    a.Name = "change a"
    fmt.Println("Print A")
}

type B struct {
    Name string
}

func (b *B) Print(change string) {
    b.Name = change
    fmt.Println("Print B")
}
{original a}
Print A
{original a}
{original b}
Print B
{change b}

同样的默认是值拷贝.. 除非你取得内存地址,, 否则是不会改变原来的值的

类型别名

上面都是为一个结构体绑定一个方法.. 那么我们可以为任意一个type定义的类型绑定一个方法么? 肯定是可以的

type TZ int

func main() {
    var c TZ
    fmt.Println(c)
    c.Print()
}

func (a *TZ) Print() {
    fmt.Println("Print TZ")
}
0
Print TZ

method.value 和Method Expression调用区别

method.value

类.方法

type TZ int

func main() {
    var c TZ
    fmt.Println(c)
    //method.value
    c.Print()
}

func (a *TZ) Print() {
    fmt.Println("Print TZ")
}

Method Expression

直接通过类型调用..而不是通过 一个类的变量来调用

type TZ int

func main() {
    var c TZ
    //Method Expression
    //因为这种调用是没有receiver的所以需要自己把 &c 传过去
    (*TZ).Print(&c)
}

func (a *TZ) Print() {
    fmt.Println("Print TZ")
}

作业

声明一个 type 为 int 的类型 然后调用一个方法传入一个increase的值 让其本身的值从累加

type TZ int

func main() {
    var c TZ
    c = 0
    c.Increase(100)
    fmt.Println(c)
}

func (a *TZ) Increase(num int) {
    *a += TZ(num)
}

TZ(num)

这里一定要把这个num转换为我们自己的TZ型,不然会因为类型不匹配编译错误

# command-line-arguments
./basic_structure.go:16:5: invalid operation: *a += num (mismatched types TZ and int)