Go:指向类型的指针与接口不兼容

时间:2018-02-17 20:42:12

标签: go

我不确定如何正确地提出问题。我有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)

}

Playground

main()有效,main2()无效。

  

prog.go:20:17:不能在writeSomething的参数中使用& file(键入** os.File)作为类型* io.Writer:       * io.Writer是指向接口的指针,而不是接口

唯一的区别是我使用了一个中间变量,但我没有做任何指针引用或解除引用。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

你不应该使用指针接口,这在Go中是不好的做法 关于不编译的代码 - 当你创建一个中间变量logWriter时,你分配一个接口变量,它有自己分配的内存来描述它存储的内容(实际类型)和对实际结构的引用。
这就是&logWriter&file具有不同类型的原因 但是,我以前很难过,你不应该使用指针接口,只使用接口类型,不要获取接口类型变量的地址。