• Golang 方法method


    方法method

    • Go中虽没有class,但依旧有method
    • 通过显示说明receiver来实现与某个类型的结合
    • 只能为同一个包中的类型定义方法
    • receiver可以是类型的值或者指针
    • 不存在方法重载
    • 可以使用值或指针来调用方法,编译器会自动完成转换
    • 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数(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()
    	b := B{}
    	b.Print()
    }
    
    //编译器根据接收者的类型,来判断它是属于哪个方法
    func (a A) Print() {
    	//取一个变量a,a就是接收者,它的接收者的类型就是structA,Print就是方法的名称,参数在Print()的括号中定义
    	//receiver就是这个函数的第一个接收者,而且是强制规定的,这个时候就变成了一个方法
    	fmt.Println("A")
    }
    func (b B) Print() {
    	fmt.Println("B")
    }
    
    

    receiver也是参数,涉及到指针传递还是值的传递

    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,a就是接收者,它的接收者的类型就是structA,Print就是方法的名称,参数在Print()的括号中定义
    	//receiver就是这个函数的第一个接收者,而且是强制规定的,这个时候就变成了一个方法
    	a.Name = "AA"
    	fmt.Println("A")
    }
    func (b B) Print() { //这里的b并不是以指针传递
    	b.Name = "BB"
    	fmt.Println("B")
    }
    //结果所示:值类型不使用指针,在这个方法结束之后,值不会被修改
    PS G:mygosrcmytest> go run .	emp4.go
    A
    AA
    B
    
    

    类型别名与方法的组合

    package main
    
    import (
    	"fmt"
    )
    
    type TZ int
    
    func main() {
    	var a TZ
    	a.Print()
    
    }
    func (a *TZ) Print() {
    	fmt.Println("TZ")
    }
    

    Method Value vs. Method Expression

    package main
    
    import (
    	"fmt"
    )
    
    type TZ int
    
    func main() {
    	var a TZ
    	a.Print()       //Method Value
    	(*TZ).Print(&a) //Method Expression  这是两种不同的调用方法
    
    }
    func (a *TZ) Print() {
    	fmt.Println("TZ")
    }
    
    

    方法访问权限

    package main
    
    import (
    	"fmt"
    )
    
    type A struct {
    	mm string //首字母小写代表私有字段
    	//首字母的大小写还是以包为级别来界定它的公有还是私有
    }
    
    func main() {
    	a := A{}
    	a.Print()
    	fmt.Println(a.mm)
    
    }
    func (a *A) Print() {
    	a.mm = "123"
    	fmt.Println(a.mm)
    }
    
    //打印结果证明方法当中可以访问结构当中的私有字段,类似与其他面向对象编程语言当中class中的方法可以访问其中的私有字段
    PS G:mygosrcmytest> go run .	emp5.go
    123
    123
    
  • 相关阅读:
    QLU Regular Contest 002 题解
    QLU_ACM 2021 专题训练(一)题解 [暴力、排序、贪心、二分]
    QLU ACM-ICPC 2020 Training Contest 11 @2016 ICPC Dalian [Cloned] 题解
    Codeforces Round #696 (Div. 2) AB题解
    Educational Codeforces Round 102 (Rated for Div. 2) ABCD题解
    20210114
    Codeforces Round #169 (Div. 2) CDE题解
    树剖注意要点
    bzoj3631树链剖分
    bzoj1103树状数组水题
  • 原文地址:https://www.cnblogs.com/skymyyang/p/7679939.html
Copyright © 2020-2023  润新知