为了账号安全,请及时绑定邮箱和手机立即绑定

Go:属性存在但 Go 编译器说它不存在?

Go:属性存在但 Go 编译器说它不存在?

Go
梦里花落0921 2021-09-20 15:04:45
文件记录器package loggerimport (    "io")type FileLogger struct{    File io.Writer}func NewFileLogger(file io.Writer) *FileLogger{    return &FileLogger{file}}func (this *FileLogger) Log(message string) error {    _, err := this.File.Write([]byte(appendNewLine(message)))    return err}filelogger_test.go:package loggerimport (    "testing"    "github.com/stretchr/testify/assert")type WriterMock struct{    data []byte}func (this WriterMock) Write(b []byte) (n int, err error) {    this.data = append(this.data, b ...)    return len(this.data), nil}func NewMockedFileLogger() *FileLogger{    writer := WriterMock{}    fileLogger := FileLogger{writer}    return &fileLogger}func TestLog(t *testing.T) {    fileLogger := NewMockedFileLogger()    fileLogger.Log("Hello World!")    assert.Equal(t, "Hello World!", string(fileLogger.File.data))}我的问题:运行 go test 时,我收到此错误消息:fileLogger.File.data undefined (type io.Writer has no field or method data)file.Logger.File确实是 of type io.Writer,但是这个字段data存在,我知道 Go 是一种强类型语言,这就是它不接受这一点的原因。如何解决这个问题?
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

作家File的FileLogger是一个接口(io.Writer),而不是一个struct。


您将需要一个类型声明,以访问data的WriterMock:


fileLooger.File.(*WriterMock).data

(注意:如果 File 不是 a ,那将会失败*WriterMock:更多关于下面的内容)


请参阅此简化示例:


包主


import "fmt"

import "io"


type WriterMock struct {

    data []byte

}


func (this WriterMock) Write(b []byte) (n int, err error) {

    this.data = append(this.data, b...)


    return len(this.data), nil

}


func main() {

    var w io.Writer = &WriterMock{}

    fmt.Printf("Hello, playground '%+v'", w.(*WriterMock).data)

}

输出:


Hello, playground '[]'

----

由于类型断言汽车错误,您应该始终检查错误,请考虑“接口转换和类型断言”部分:


但如果结果证明该值不包含字符串,则程序将因运行时错误而崩溃。

为了防止出现这种情况,请使用“逗号,好的”习语来安全地测试该值是否为字符串:


str, ok := value.(string)

if ok {

    fmt.Printf("string value is: %q\n", str)

} else {

    fmt.Printf("value is not a string\n")

}


查看完整回答
反对 回复 2021-09-20
  • 1 回答
  • 0 关注
  • 231 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信