八、Go语言—— method

1 method

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

import "fmt"

type A struct{
    Name string
}

type B struct{
    Name string
}

func main() {
    a:=A{}
    a.Print()
}

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

这里写图片描述

package main

import "fmt"

type A struct{
    Name string
}

type B struct{
    Name string
}

func main() {
    a:=A{}
    a.Print()

    b:=B{}
    b.Print()
}

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

//go 语言没有重载
func (b B)Print(){
    fmt.Println("B")
}

这里写图片描述

package main

import "fmt"

type A struct{
    Name string
}

type B struct{
    Name string
}

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

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

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

//go 语言没有重载
func (b B)Print(){
    b.Name="BB"
    fmt.Println("B")
}

这里写图片描述

package main

import "fmt"

type XY int

func main() {
    var a XY

    //method value
    a.Print()

    //method expression
    (*XY).Print(&a)
}

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

这里写图片描述

2 练习

声明一个底层类型为 int 的类型,并实现调用某个方法就递增100

package main

import (
    "fmt"
)

type X int

func (x *X) Increase(num int) {
    *x += X(num)
}

func main() {
    var a X
    a.Increase(100)
    fmt.Println(a)
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/80386333