golang基础小记(15)——方法(Method)

方法

方法(Method)就是一类带特殊的接收者(Receiver)参数的函数。其与函数的区别在于,函数不属于任何类型,方法属于特定的类型。
定义格式:

func (接收者变量 接收者类型) 方法名(参数) 返回值 {
	函数体
}

示例:

type myInt int

// 给myInt类型添加方法,判断值是否大于5
func (i myInt) biggerThanFive() bool {
	if i > 5 {
		return true
	}
	return false
}

func main() {
	var a myInt
	a = 10
	// myInt类型的方法只有myInt类型的变量才能使用
	fmt.Println(a.biggerThanFive()) // true
}

注意:非本地类型不能定义方法
基本类型(int、string)等不是本地类型,不能直接定义方法,但我们可以自定义类型,如上例中的myInt,这样就可以为myInt类型添加方法,而且myInt具有int类型的特性。

接收者参数

接收者参数可以是值类型,也可以是指针类型。区别在于指针类型,可以在方法中修改变量本身,而值类型只能修改变量副本,不会对变量本身产生影响。
以结构体为例:

type house struct {
	size, price int
}

// 接收者变量名一般用类型名首字母的小写
// 接收者参数是值类型
func (h house) f1(newSize int) {
	h.size = newSize
}

// 接收者参数是指针类型
func (h *house) f2(newSize int) {
	h.size = newSize
}

func main() {
	h1 := house{
		100,
		150,
	}
	h1.f1(120)
	fmt.Printf("%#v\n", h1) // main.house{size:100, price:150}
	h1.f2(150) // 这里可以是h1,也可以是(&h1)
	fmt.Printf("%#v", h1) // main.house{size:150, price:150}
}

可以看到,调用f1方法后,变量h1没有被修改;调用f2方法后,变量h1被修改。

什么时候使用指针类型接收者

  1. 需要修改接收者变量
  2. 拷贝接收者变量的开销较大
  3. 保证一致性,一个方法用了,其他的也用指针类型接收者

参考1
参考2

猜你喜欢

转载自blog.csdn.net/m0_37710023/article/details/107690823