Golang定义在值或者指针上的方法的区别

接收者为指针和接收者为普通变量的方法的区别:

  • 传递普通变量传递值拷贝,不能修改原始值,如果是大对象则内存效率不高。
  • 传递变量的指针,指针为固定大小,效率更高,可以就地修改对象的原始值。

在方法集的使用上,无论接收者是变量还是指针,都能直接正确调用,无需特殊处理, 能正确调用所有绑定在该值或指针上的方法,Go会自动帮我们处理引用与解引用。

package main

import (
	"fmt"
	"strings"
)

type Part struct {
	Id   int
	Name string
}

func (part *Part) LowerCase() {
	part.Name = strings.ToLower(part.Name)
}

func (part *Part) UpperCase() {
	part.Name = strings.ToUpper(part.Name)
}

func (part Part) String() string {
	return fmt.Sprintf("<<%d %q>>", part.Id, part.Name)
}

func (part Part) HasPrefix(prefix string) bool {
	return strings.HasPrefix(part.Name, prefix)
}

func main() {
	//
	p := &Part{1, "this is a new part"}
	p.UpperCase()
	fmt.Println(p)
	fmt.Println(p.HasPrefix("prefix"))

	//
	var p1 Part
	p1 = Part{2, "this is part 2"}

	p1.UpperCase()
	fmt.Println(p1)
	p1.LowerCase()
	fmt.Println(p1)
	fmt.Println(p1.HasPrefix(""))

}

output:

<<1 "THIS IS A NEW PART">>
false
<<2 "THIS IS PART 2">>
<<2 "this is part 2">>
true