Go语言入门8-方法method

本文深入探讨了Go语言中的方法与接收者概念,解释了如何定义和使用方法,包括值接收者和指针接收者的区别,以及它们如何影响方法的内部行为。同时,文章还介绍了方法如何调用结构体的非公开字段,以及如何处理同名方法和结构体嵌套的情况。
方法就是一类带特殊的 接收者 参数的函数。
方法接收者在它自己的参数列表内,位于func 关键字和方法名之间
  1. 通过显示说明receiver(接收者)来实现与某个类型的组合,receiver是方法的强制性的第一个参数

在此例中,Abs 方法拥有一个名为 v,类型为 Vertex 的接收者。

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
	v := Vertex{3, 4}
	fmt.Println(v.Abs())	//5
}
  1. Receiver 可以是类型的值或者指针
type A struct {
	Name string
}

type B struct {
	Name string
}

func main() {
	a := A{}
	a.Print()
	fmt.Println(a.Name) //AAA
	b := B{}
	b.Print()
	fmt.Println(b.Name) //空的
}

func (a *A) Print() {
	a.Name = "AAA"
	fmt.Println("A") //A
}
func (b B) Print() {	//不通过指针的话只是一个值拷贝,不会影响本来的值
	b.Name = "BBB"
	fmt.Println("B")	//B
}

指针接收者的方法可以修改接收者指向的值(就像 Scale 在这做的)。由于方法经常需要修改它的接收者,指针接收者比值接收者更常用。

package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
//若使用值接收者,那么 Scale 方法会对原始 Vertex 值的副本进行操作。(对于函数的其它参数也是如此。)Scale 方法必须用指针接受者来更改 main 函数中声明的 Vertex 的值。
//试着移除Scale 函数声明中的 *,观察此程序的行为如何变化。
func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs())
}
  1. 方法可以调用结构中的非公开字段
type A struct {
	name string
}

func main() {
	a := A{}
	a.Print()
	fmt.Println(a.name)	//123
}

func (a *A) Print() {
	a.name = "123"
}
  1. 不存在方法重载,接收者类型不同的话是可以有同名方法的,互不干扰
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("AAA")	//AAA
}
func (b B) Print() {
	fmt.Println("BBB")	//BBB
}
  1. 只能为同一个包中的类型定义方法
  2. 可以使用值或指针来调用方法,编译器会自动完成转换
  3. 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
  4. 类型别名不会拥有底层类型所附带的方法
type XY int

func (xy *XY) add(num int) {
	*xy += XY(num)
}

func main() {
	var a XY
	a.add(100)
	fmt.Println(a)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值