Go语言学习笔记 --- method

学习笔记根据 无闻 go语言基础教程 整理

method

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

import (
    "fmt"
)

type A struct {
    Name string
    Age int
    grade string // 私有字段 以package为级别,都是公有的,不同包都是私有的
}

type TZ int // 初始化一个int型的类型别名 TZ

func main() {
    test1()
    test2()
    test3()
    test4()
    test5()
    test6()
}

// 定义 A 的方法 Print 结构为: func + 接收者 + 方法名 ; go语言中没有重载的概念
func (a A) Print() {
    fmt.Println("A")
}

// 设置名称 内部值拷贝
func (a A) SetName() {
    a.Name = "A"
}

// 设置年龄 内部指针拷贝
func (a *A) SetAge() {
    a.Age = 10
}

// 设置年级 访问私有字段
func (a *A) SetGrade() {
    a.grade = "g3"
}

// 为 TZ 类型的a 绑定一个Print方法
func (a *TZ) Print() {
    fmt.Println("TZ")
}

// 普通测试
func test1() {
    a := A{}
    a.Print() // A
}

// 测试值拷贝
func test2() {
    a := A{}
    a.SetName()
    fmt.Println(a.Name) // "" // 输出零值, 空字符串 , 说明:此处值拷贝,未修改成功。
}

// 测试指针拷贝
func test3() {
    a := A{}
    a.SetAge()
    fmt.Println(a.Age) // 10 // 此处修改成功
}

// 测试类型别名绑定的方法 method value
func test4() {
    var a TZ
    a.Print() // TZ
}

// 测试 method expression 的写法
func test5() {
    var a TZ
    (*TZ).Print(&a) // TZ // 这种方法
}

// 测试私有字段的访问权限
func test6() {
    a := A{}
    (*A).SetGrade(&a) // 通过 method expression 的写法 同 a.SetGrade()
    fmt.Println(a.grade) // "g3"
}

你可能感兴趣的:(Golang)