Go 将切片转换为元组的便利函数?
在Python中,可以编写如下代码,从列表中分配多个值:Go 将切片转换为元组的便利函数?,go,Go,在Python中,可以编写如下代码,从列表中分配多个值: (a, b, c, d) = [1,2,3,4] 是否有一组类似的用于切片的Go库函数?也就是说,我可以做到: 主程序包 func get3(s[]接口{})( 接口{}, b接口{}, c接口{}, rest[]接口{}){ 返回s[0]、s[1]、s[2]、s[4:] } func main(){ s:=make([]接口{},5); 对于i:=0;i
(a, b, c, d) = [1,2,3,4]
是否有一组类似的用于切片的Go库函数?也就是说,我可以做到:
主程序包
func get3(s[]接口{})(
接口{},
b接口{},
c接口{},
rest[]接口{}){
返回s[0]、s[1]、s[2]、s[4:]
}
func main(){
s:=make([]接口{},5);
对于i:=0;i<5;i++{s[i]=i}
a、 b,c,u:=get3(s)
印刷品(a.(int))
印刷品(b.(int))
印刷品(c.(int))
}
有没有一种标准的地鼠方法可以做到这一点
有没有办法解决界面{}丑陋的问题?不是这样的;您需要动态类型或参数多态性,这在Go中不可用。我能想到的最接近的方法是摆弄反射,比如: 所以丑并没有从功能中消失
但请注意,所有这些都是在运行时发生的,因此它既不安全也不高效,而且肯定不是惯用的Go;您需要动态类型或参数多态性,这在Go中不可用。我能想到的最接近的方法是摆弄反射,比如: 所以丑并没有从功能中消失
但请注意,所有这些都是在运行时发生的,因此它既不安全也不高效,而且肯定不是惯用的Go。我认为您不能,至少不能以惯用/干净的方式。您可以执行多个赋值,但必须直接或通过闭包传递单个值:
package main
import (
"fmt"
)
func valuesFromList(list[]int,startFrom int) func() int {
i:=startFrom
return func() int {
ret := list[i]
i++
return ret
}
}
func main () {
list := []int{0,1,2,3,4,5,6,7,8,9}
yield := valuesFromList(list,5)
//This works
a,b,c := yield(),yield(),yield()
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
//This also works
d,e,f := list[0],list[1],list[2]
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
//This won't work
//g,h,i:= list[7:9]
}
我认为你不能,至少不能用惯用/干净的方式。您可以执行多个赋值,但必须直接或通过闭包传递单个值:
package main
import (
"fmt"
)
func valuesFromList(list[]int,startFrom int) func() int {
i:=startFrom
return func() int {
ret := list[i]
i++
return ret
}
}
func main () {
list := []int{0,1,2,3,4,5,6,7,8,9}
yield := valuesFromList(list,5)
//This works
a,b,c := yield(),yield(),yield()
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
//This also works
d,e,f := list[0],list[1],list[2]
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
//This won't work
//g,h,i:= list[7:9]
}
为什么不直接分配元素,而不是尝试创建一个泛型函数来这样做呢?因为编写
first、middle、last:=splitName[0]、splitName[1]、splitName[2]是一个难看的样板文件,为什么不直接分配元素,而不是尝试创建一个通用函数来实现呢?因为写first、middle、last:=splitName[0]、splitName[1]、splitName[2]是一个难看的样板
sl := []int{1, 2, 3, 4, 5, 6} // int or any other type
var a, b, c int
var rest []int
extract(sl, &a, &b, &c, &rest)
package main
import (
"fmt"
)
func valuesFromList(list[]int,startFrom int) func() int {
i:=startFrom
return func() int {
ret := list[i]
i++
return ret
}
}
func main () {
list := []int{0,1,2,3,4,5,6,7,8,9}
yield := valuesFromList(list,5)
//This works
a,b,c := yield(),yield(),yield()
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
//This also works
d,e,f := list[0],list[1],list[2]
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
//This won't work
//g,h,i:= list[7:9]
}