接收者为指针和接收者为普通变量的方法的区别:
- 传递普通变量传递值拷贝,不能修改原始值,如果是大对象则内存效率不高。
- 传递变量的指针,指针为固定大小,效率更高,可以就地修改对象的原始值。
在方法集的使用上,无论接收者是变量还是指针,都能直接正确调用,无需特殊处理, 能正确调用所有绑定在该值或指针上的方法,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