【发布时间】:2018-12-17 00:12:19
【问题描述】:
案例一
我有以下方法,效果很好。这里我返回一个数组作为接口。
func ReturnArrayAsInterface1() interface{} {
retval := make([]int, 0)
retval = append(retval, 4, 6, 8, 10)
return retval
}
案例 2
考虑以下方法。这里我想在发生恐慌的情况下返回错误,所以我在开头定义了retval,并在defer中更改了它的值。但这会显示错误“不能使用 'retval' (type interface{}) as type []Type”
func ReturnArrayAsInterface2() (retval interface{}) {
defer func() {
if r := recover(); r != nil {
retval = r
}
}()
retval = make([]int, 0)
retval = append(retval, 4, 6, 8, 10) . // error here : Cannot use 'retval' (type interface{}) as type []Type
return retval
}
所以我想知道的是,为什么第一个函数可以正常工作而第二个函数不能?有什么办法可以克服吗?
案例 3
这也类似于 案例 2:
func ReturnArrayAsInterface3() interface{} {
var retval interface{}
defer func() {
if r := recover(); r != nil {
retval = r
}
}()
retval = make([]int, 0)
retval = append(retval, 4, 6, 8, 10) . // error here : Cannot use 'retval' (type interface{}) as type []Type
return retval
}
【问题讨论】:
-
第二种和第三种情况是非常单调的 Go。如果一个函数可能返回一个值或一个错误,它应该有两个返回值,就像 Go 中的每个其他这样的函数一样 - 例如
func ReturnArrayAsInterface() (interface{},error). -
return []int{4, 6, 8, 10} -
哈哈哈,@dolmen。这只是我举的一个例子。实际值并不像 []int{4, 6, 8, 10} 这么简单 :) 另外我的问题不是返回该数组,而是要了解代码的工作原理!