下面是从《Go语言从入门到进阶实战》一书中摘的代码片段:logger.go中有三个LogWriter,它们有什么区别?第12的LogWriter是不是接口的方法列表的切片?第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例,这个没搞明白,比较疑惑,请帮忙解答下,谢谢!!!1.logger.go2.console.gopackage mainimport ( "fmt" "os")// 命令行写入器type consoleWriter struct {}// 实现LogWriter的Writefunc (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.gopackage 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")}
2 回答
动漫人物
TA贡献1815条经验 获得超10个赞
logger.go中有三个LogWriter,它们有什么区别?
没什么区别。硬要说有的话,第一个是定义,后两个是使用
第12的LogWriter是不是接口的方法列表的切片?
是
第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例
这个就是个形参,调用者可以传入任何满足此interface的结构体实例
暮色呼如
TA贡献1853条经验 获得超9个赞
需要好好理解一下,什么是 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 实例
- 2 回答
- 0 关注
- 623 浏览
添加回答
举报
0/150
提交
取消