Golang 方法method

skymyyang · · 5439 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

方法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:\mygo\src\mytest> go run .\temp4.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:\mygo\src\mytest> go run .\temp5.go
123
123

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:skymyyang

查看原文:Golang 方法method

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

5439 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传