乐趣区

关于go:Go-快速入门指南-方法

概述

办法的申明和一般函数的申明相似,只是在函数名字后面多了一个 接收者参数 (接收者参数将办法绑定到其对应的数据类型上)。
办法能够绑定到任何数据类型上,然而大多数状况下,绑定的都是 构造体。

语法规定

func (接收者参数) 办法名称(参数列表 ...) 返回值列表... {// do something}

例子

构造体办法

package main

import "fmt"

type person struct {
    name string
    age  int16
}

func (p person) sayName() {fmt.Printf("Hi, my name is %s\n", p.name)
}

func (p person) sayAge() {fmt.Printf("Hi, my age is %d\n", p.age)
}

func main() {
    tom := &person{
        name: "Tom",
        age:  6,
    }
    tom.sayName()
    tom.sayAge()}

// $ go run main.go
// 输入如下 
/**
  Hi, my name is Tom
  Hi, my age is 6
*/

构造体指针办法

相比构造体办法,指针构造体办法除了将办法参数变为指针外,在援用对应的字段时,无需加 * 标识符
这一点和一般指针变量援用时有所区别,须要留神。

package main

import "fmt"

type person struct {
    name string
    age  int16
}

func (p *person) sayName() { // 构造体为指针类型
    fmt.Printf("Hi, my name is %s\n", p.name)
}

func (p *person) sayAge() { // 构造体为指针类型
    fmt.Printf("Hi, my age is %d\n", p.age)
}

func main() {
    tom := &person{
        name: "Tom",
        age:  6,
    }
    tom.sayName()
    tom.sayAge()}

// $ go run main.go
// 输入如下 
/**
  Hi, my name is Tom
  Hi, my age is 6
*/

编译检测

编译器会对办法的 接收者参数 进行查看,具体来说:

  • 接收者形参为一般变量类型

    • 实参为一般变量类型,编译失常
    • 实参为指针变量类型,编译失常
  • 接收者形参为指针变量类型

    • 实参为一般变量类型,编译报错
    • 实参为指针变量类型,编译失常

reference

  1. Go 圣经

分割我

退出移动版