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")

}

回答:

需要好好理解一下,什么是 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

回到顶部