走。 Interface中单值上下文中的多值

时间:2016-05-18 12:01:40

标签: go error-handling interface

我在下面阅读了主题

Go: multiple value in single-value context

但在我的案例中,我不理解这个解释。可能就是这样,因为我想使用界面

我在下面的案例

中收到错误multiple-value NewObject() in single-value context
type Facade interface {
    GetOne() int
}

type ObjectOne struct{
    one int
}

func NewObject()(Facade, error){
    o := &ObjectOne{}
    return o , errors.New("Some funny error")
}

func(o * ObjectOne)GetOne()int{
    return 1
}

func SomeWhereInCode(){
    newFacade , err := Facade(NewObject())
// And here. I get error probbably because Facade constructor return one arguments (interface) and NewObject() return two. How should be ? 
}

我还试过传递error作为ObjectOne的指针,但仍然得到错误编译器

type Facade interface {
    GetOne() int
}

type ObjectOne struct{
    one int
}

func NewObject(facadeError* error)(Facade, error){
    o := &ObjectOne{}
    *facadeError = errors.New("Some funny error")
    return o , *facadeError
}

func(o * ObjectOne)GetOne()int{
    return 1
}

func SomeWhereInCode(){
    var facadeError = error()
    newFacade , err := Facade(NewObject(&facadeError))
}

2 个答案:

答案 0 :(得分:4)

在表达式中:

newFacade , err := Facade(NewObject())

Facade(NewObject())不是构造函数,而是显式类型转换。您根本不需要它,因为NewObject()已经是构造函数,返回Facade类型和错误。所以只是:

newFacade , err := NewObject()

应该对我有用。

答案 1 :(得分:3)

问题是NewObject有多个返回值,你不能链或下一个返回多个值的函数(在同一行中)。

目前还不清楚为什么你试图在一个你认为应该是Facade的返回值上调用Facade(...),你在进行类型转换吗?

尝试取出值并处理错误,然后调用外部函数。

type Facade interface {
    GetOne() int
}

type ObjectOne struct{
    one int
}

func NewObject()(Facade, error){
    o := &ObjectOne{}
    return o , errors.New("Some funny error")
}

func(o * ObjectOne)GetOne()int{
    return 1
}

func SomeWhereInCode(){
    newFacade , err := NewObject())
    if err != nil {
        // handle err or panic
    }
    Facade(newFacade)
}