返回接口时键入断言

时间:2017-05-03 02:10:48

标签: go

我是golang的新手;但是根据我目前的知识,我知道值类型引用类型都可以实现接口。但似乎关于类型断言,如何返回结构确实很重要。请参阅以下内容:

package main

import (
    "fmt"
)

type SomeError interface {
    Error() string
}

type ConcreteError struct{}

func (ConcreteError) Error() string {
    return "?"
}

func returnPointer() SomeError {
    return &ConcreteError{}
}

func returnVal() SomeError {
    return ConcreteError{}
}

func main() {
    pointer := returnPointer()
    value := returnVal()
    _, pointerWithPointer := pointer.(*ConcreteError);
    _, pointerWithValue := pointer.(ConcreteError);

    _, valueWithValue := value.(ConcreteError);
    _, valueWithPointer := value.(*ConcreteError)

    fmt.Printf("Returning a pointer, assert using (*ConcreteError): %v\n", pointerWithPointer); // true
    fmt.Printf("Returning a pointer, assert using (ConcreteError): %v\n", pointerWithValue); // false
    fmt.Printf("Returning a value,   assert using (ConcreteError): %v\n", valueWithValue); // true
    fmt.Printf("Returning a value,   assert using (*ConcreteError): %v\n", valueWithPointer); // false
}

因此,如果我的理解是正确的,那么用户需要知道如何返回结构以正确断言其类型?

我要猜测并假设golang中的标准做法是总是返回一个指向结构的指针(即* PathError)?

链接播放:here

1 个答案:

答案 0 :(得分:1)

  

因此,如果我的理解是正确的,那么用户需要知道如何返回结构以正确断言其类型?

这取决于。如果需要传递类型断言 - 您肯定需要知道值的确切类型。 a*a是不同的类型。

  

我要猜测并假设golang中的标准做法是始终返回指向结构的指针(即* PathError)?

没有