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

文件记录器


package logger


import (

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


import (

    "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 是一种强类型语言,这就是它不接受这一点的原因。


如何解决这个问题?


梦里花落0921
浏览 233回答 1
1回答

红颜莎娜

作家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")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go