Pointers vs Values
-
内置类型和引用类型不能直接使用类型方法,只能通过自定义类型才能使用自定义方法
type I int func (i I) f() { }
-
虽然值方法和指针方法都可以被值变量和指针变量调用,但是官方文档规定一条rule
The rule about pointers vs. values for receivers is that value methods can be invoked on pointers and values, but pointer methods can only be invoked on pointers.
-
receiver是指针还是值,取决于自定义类型的底层数据,如果不希望底层数据被修改,则使用值,否则使用指针
type B struct { s []int c rune } func (b B) test() { b.s[0] = 20 b.c = 'H' } func (b *B) test1() { b.s[0] = 30 b.c = 'K' } func main() { b := B{ s:[]int{1,2,3}, c:'h', } b.test() fmt.Println(b.s) fmt.Println(string(b.c)) //[20 2 3] //h b.test1() fmt.Println(b.s) fmt.Println(string(b.c)) //[30 2 3] //K }
从上例可以看到,当receiver是值时,引用类型虽然是拷贝的即传值,但是实际是共享底层数据的,所以调用传值方法时,底层数据的修改会影响变量。