代码之家  ›  专栏  ›  技术社区  ›  snaggs

Golang接口:无法将值赋给未报告的字段

go
  •  0
  • snaggs  · 技术社区  · 5 年前

    我试着模拟一些用于单元测试的结构,并使用 site

    我写了如下:

    实干家

    package user
    
    import "errors"
    
    type Doer interface {
        Do(int, string) error
    }
    
    type DoerImp struct {
    
    }
    
    func (d *DoerImp)Do(val int, str string) error{
        if val == 3{
            return errors.New("Some error")
        }
        return nil
    }
    

    用户

    package user
    
    type User struct {
        doer Doer
    }
    
    func (u *User) UseDoer() {
        u.doer.Do(1, "abc")
    }
    

    我想运行以下代码:

    c := &user.DoerImp{}
    u := user.User{c}
    u.UseDoer()
    

    但是我得到一个错误: Cannot assign value to unexported field 'doer'

    我做错什么了?
    我的 c 价值有 Doer 接口签名

    1 回复  |  直到 5 年前
        1
  •  1
  •   Kevin Sandow    5 年前

    错误表明 doer 是未报告的字段,因此无法从另一个包访问。

    根据您是否希望可以访问它,您可以更改要导出的声明:

    package user
    
    type User struct {
        Doer Doer
    }
    
    func (u *User) UseDoer() {
        u.Doer.Do(1, "abc")
    }
    

    package user
    
    func New(doer Doer) *User {
        return &User{doer}
    }
    
    type User struct {
        doer Doer
    }
    
    func (u *User) UseDoer() {
        u.doer.Do(1, "abc")
    }
    

    然后你可以这样使用它:

    u := user.New{&user.DoerImp{}}
    u.UseDoer()