go语言中关于接口类型的疑惑
下面是从《Go语言从入门到进阶实战》一书中摘的代码片段:
logger.go中有三个LogWriter,它们有什么区别?
第12的LogWriter是不是接口的方法列表的切片?
第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例,这个没搞明白,比较疑惑,请帮忙解答下,谢谢!!!
1.logger.go
2.console.go
package mainimport (
"fmt"
"os"
)
// 命令行写入器
type consoleWriter struct {
}
// 实现LogWriter的Write
func (f *consoleWriter) Write(data interface{}) error {
// 将数据序列化为字符串
str := fmt.Sprintf("%v\n", data)
// 将数据以字节数组写入到命令行
_, err := os.Stdout.Write([]byte(str))
return err
}
// 创建命令行写入器实例
func newConsoleWriter() *consoleWriter {
return &consoleWriter{}
}
3.main.go
package mainimport "fmt"
// 创建日志器
func createLogger() *Logger {
// 创建日志器
l := NewLogger()
// 创建命令行写入器
cw := newConsoleWriter()
// 注册命令行写入器到日志器
l.RegisterWriter(cw)
// 创建文件写入器
fw := newFileWriter()
// 设置文件名
if err := fw.SetFile("log.log"); err != nil {
fmt.Println(err)
}
// 注册文件写入器到日志器
l.RegisterWriter(fw)
return l
}
func main() {
// 准备日志器
l := createLogger()
// 写一个日志
l.Log("hello")
}
回答:
需要好好理解一下,什么是 interface, 是什么实现了 interface
在 go 里面是隐式实现 interface,只要一个 type 实现了 interface 下定义的所有 func ,那么就可以说这个 type 满足这个 interface 。
第 4 行定义了一个 LogWriter interface,包含 func Write
第 12 行是 []LogWriter 是满足 LogWriter interface
定义的具体类型的 slice
第 16 行,就是一个满足 LogWriter interface 的具体类型
往下看,可以发现
type consoleWriter struct {}实现了 Write func
那么所有需要传入参数 LogWriter 的地方,都可以传入 consoleWriter 实例
回答:
logger.go中有三个LogWriter,它们有什么区别?
没什么区别。硬要说有的话,第一个是定义,后两个是使用
第12的LogWriter是不是接口的方法列表的切片?
是
第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例
这个就是个形参,调用者可以传入任何满足此interface的结构体实例
以上是 go语言中关于接口类型的疑惑 的全部内容, 来源链接: utcz.com/p/183155.html