简体   繁体   English

走。 接口中单值上下文中的多值

[英]Go. Multiple-value in single-value context in Interface

I read below topic 我读了下面的主题

Go: multiple value in single-value context Go:单值上下文中的多个值

But I don't understand this explain in my case. 但是我不理解这种解释。 May be that's way because I want to use interface 可能就是这样,因为我想使用界面

I get error multiple-value NewObject() in single-value context in below case 在以下情况multiple-value NewObject() in single-value context ,我multiple-value NewObject() 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 ? 
}

I also tryed pass error as pointer to ObjectOne but still get error compiler 我也ObjectOneerror传递为指向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))
}

In the expression: 在表达式中:

newFacade , err := Facade(NewObject())

Facade(NewObject()) is not a constructor but an explicit type conversion. Facade(NewObject())不是构造函数,而是显式类型转换。 You do not need it at all because NewObject() , being a constructor already, returns a Facade type and an error. 您根本不需要它,因为已经成为构造函数的NewObject()返回Facade类型和错误。 So just: 所以就:

newFacade , err := NewObject()

should work seems to me. 在我看来应该可以工作。

The problem is that NewObject has multiple return values and you can't chain or next functions that return multiple values (in the same line). 问题在于NewObject具有多个返回值,并且您不能链接或返回多个值的函数(在同一行中)。

It's unclear why you are trying to call Facade(...) on a return value that you think should be a Facade, are you doing a type conversion? 目前尚不清楚为什么要尝试在您认为应该是Facade的返回值上调用Facade(...),是否在进行类型转换?

Try getting out the value and dealing with the error and then calling the outside function. 尝试找出该值并处理错误,然后调用外部函数。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM