我不确定如何正确地提出问题。我有2个代码片段应该做同样的事情,但显然他们没有,因为一个有效,另一个没有(没有编译)
func writeSomething(writer *io.Writer) {
}
func main() {
file, _ := os.Create("error.log")
var logWriter io.Writer = file
writeSomething(&logWriter)
}
func main2() {
file, _ := os.Create("error.log")
writeSomething(&file)
}
main()有效,main2()无效。
prog.go:20:17:不能在writeSomething的参数中使用& file(键入** os.File)作为类型* io.Writer: * io.Writer是指向接口的指针,而不是接口
唯一的区别是我使用了一个中间变量,但我没有做任何指针引用或解除引用。
我在这里做错了什么?
答案 0 :(得分:2)
你不应该使用指针接口,这在Go中是不好的做法
关于不编译的代码 - 当你创建一个中间变量logWriter
时,你分配一个接口变量,它有自己分配的内存来描述它存储的内容(实际类型)和对实际结构的引用。
这就是&logWriter
和&file
具有不同类型的原因
但是,我以前很难过,你不应该使用指针接口,只使用接口类型,不要获取接口类型变量的地址。