我说我有
connection := pool.GetConnection().(*DummyConnection)
其中pool.GetConnection
返回interface{}
,我想将其投放到DummyConnection
。
我想更改GetConnection接口以返回错误。代码开始看起来像这样:
connectionInterface, err := pool.GetConnection()
connection := connectionInterface.(*DummyConnection)
我想知道,我可以避免使用辅助变量并将它们放在一行吗?
答案 0 :(得分:3)
您无法将这两个语句组合在一起,因为该函数返回一对值,并且无法说明您想要对其进行类型断言。使用赋值它是有效的,因为标识符的顺序和返回值一样,但是你如何期望编译器推断出你想要在哪个值上执行类型断言呢?
我不建议在Go中尝试过多地减少代码。这与语言的设计方式并不完全一致,我认为这是故意的。理念是,这更容易阅读,因为没有太多的抽象,也因为没有给出这么多选项来实现相同的结果。无论如何,你不会真的用这种类型的断言节省太多,而且这样的任何函数调用都需要一些额外的代码行来进行错误处理。这几乎是Go的常态。
答案 1 :(得分:-1)
某种解决方案。不减少代码,但通过将变量移动到匿名内部函数来减少函数范围内的变量。
package main
import "fmt"
type t struct{}
func foo()(interface{},error){
return &t{},nil
}
func main() {
var myT *t
myT, err := func() (*t,error){
i,e:=foo()
return i.(*t),e
}()
fmt.Println(myT,err)
}