我是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
答案 0 :(得分:1)
因此,如果我的理解是正确的,那么用户需要知道如何返回结构以正确断言其类型?
这取决于。如果需要传递类型断言 - 您肯定需要知道值的确切类型。 a
和*a
是不同的类型。
我要猜测并假设golang中的标准做法是始终返回指向结构的指针(即* PathError)?
没有