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 ?

类似文章

发表回复

您的电子邮箱地址不会被公开。