go语言中关于接口类型的疑惑

下面是从《Go语言从入门到进阶实战》一书中摘的代码片段:
logger.go中有三个LogWriter,它们有什么区别?
第12的LogWriter是不是接口的方法列表的切片?
第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例,这个没搞明白,比较疑惑,请帮忙解答下,谢谢!!!

1.logger.go

图片描述

2.console.go

package main

import (
    "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 main

import "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.3k
2 个回答

需要好好理解一下,什么是 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的结构体实例

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题