缘起
有些时候为了避免参数的copy,会尽可能将参数定义为指针类型;如果参数是一个接口,那么是不是要定义为接口的指针呢?如果不定一为指针是不是会导致“值传递”呢?
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package main import "fmt" type Messager interface { String() string } type SimpleMessage struct { } // 可以看出,无论对象还是对象指针都实现了String方法 func (this SimpleMessage) String() string { return "对于接口参数在运行时,传递的是 值 还是 地址,取决于运行时传递的是 值 还是 地址,定义的时候不要写成接口的指针" } func printMessager(m Messager, obj bool) { if obj { fmt.Printf("%p\n", &m) // 如果传入的是对象 } else { fmt.Printf("%p\n", m) // 如果传入的是指针 } fmt.Println(m.String()) } func main() { fmt.Println("传递对象时,进行了值的copy,可以看到地址不同") obj := SimpleMessage{} fmt.Printf("%p\n", &obj) printMessager(obj, true) // 传对象 fmt.Println("传递指针时,没有做值的copy,可以看到地址相同") msg := &SimpleMessage{} fmt.Printf("%p\n", msg) printMessager(msg, false) // 传指针 } |
http://play.golang.org/p/sw7ejPVV1t
结论
永远不要把接口参数前面添加一个星号