Go 将切片转换为元组的便利函数?

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

在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<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]
}