缘起
有些时候为了避免参数的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
结论
永远不要把接口参数前面添加一个星号