go &和*的一点疑惑
今天又看了一遍代码,发现io.Writer是一个接口,Greet函数中使用了fmt.Fprintf而fmt.Fprintf需要io.Writer作为参数,如果Greet传入参数的时候使用了
bytes.Buffer{}而不是*bytes.Buffer{}编辑器就会报错:
Cannot use 'buffer' (type Buffer) as type io.Writer Type does not implement 'io.Writer' as 'Write' method has a pointer receiver
意思就是要作为依赖注入到这个函数中去必须要是指针类型,所以得把他的指针类型传进去,所以得加&
另外参数声明是带*的,那传入的时候一定要带&,*代表这个参数是指针变量,&代表取变量的指针地址。
以下是原文:
代码如下
buffer := &bytes.Buffer{} rec := &Rec{} fmt.Printf("&rec value %v",rec) fmt.Println("") fmt.Printf("&buffer value %v",buffer) fmt.Println("") fmt.Printf("*&rec value %v",*rec) fmt.Println("") fmt.Printf("*&buffer value %v",*buffer) fmt.Println("") fmt.Printf("&&rec value %v",&rec) fmt.Println("") fmt.Printf("&&buffer value %v",&buffer)
结果是:
&rec value &{[] 0 0} &buffer value *&rec value {[] 0 0} *&buffer value {[] 0 0} &&rec value 0xc000006038 &&buffer value 0xc000006030
首先Rec和bytes.Buffer是一样的数据结构,但是他们两个取地址确实截然不同的两个结果,但是继续取值却是一样的。
还有就是当函数参数为 “writer io.Writer”的时候,直接将
buffer := bytes.Buffer{}
用作参数会报错:
cannot use buffer (type bytes.Buffer) as type io.Writer in argument
然而用了:
buffer := &bytes.Buffer{}
就不会报错了,这说明buffer的地址变量的类型是 io.Writer ?