【发布时间】:2018-02-17 20:42:11
【问题描述】:
我不确定如何正确地提出问题。我有 2 个 go 代码 sn-ps 应该做完全相同的事情,但显然它们没有,因为一个有效,另一个无效(不编译)
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 (type **os.File) 作为 type *io.Writer: *io.Writer 是指向接口的指针,不是接口
唯一的区别是我使用了一个中间变量,但我没有做任何指针引用或取消引用。
我在这里做错了什么?
【问题讨论】:
-
错误信息是准确的。只需删除函数签名 func writeSomething(writer io.Writer) 中的间接性,无论如何都不需要
-
好的,谢谢,这行得通。但我仍然会感兴趣为什么第一个版本可以工作,即使它做了同样的事情
-
在
main中,您将file转换为接口io.Writer,然后传递writeSomething指向接口的指针,这正是writeSomething所期望的。 -
在
main2中有一个指向os.File的指针,然后将指向该指针的指针传递给writeSomething。 Go 无法将其转换为指向接口io.Writer的指针。
标签: go