Go中的Pair / tuple数据types

在进行Tour of Go的最后一个练习时 ,我决定需要一个( stringint )对的队列。 这很简单:

 type job struct { url string depth int } queue := make(chan job) queue <- job{url, depth} 

但是这让我想到:Go中是否有内置的pair / tuple数据types? 支持从一个函数返回多个值 ,但是AFAICT,产生的多值元组并不是Gotypes系统中的一等公民。 是这样吗?

至于“你有什么尝试”部分,显而易见的语法(来自Python程序员的POV)

 queue := make(chan (string, int)) 

没有工作。

Go中没有元组types,而且你是正确的,函数返回的多个值不代表第一个类对象。

Nick的答案显示了如何使用interface {}来处理任意types。 (我可能使用了一个数组而不是一个结构来使它像一个元组一样可索引,但关键的想法是接口{}types)。

我的另一个答案显示了如何做类似的事情,避免使用匿名结构创build一个types。

这些技术有一些元组的属性,但不是,它们不是元组。

你可以这样做。 它看起来比一个元组更罗嗦,但这是一个很大的改进,因为你得到了types检查。

编辑:replace完整的工作示例片段,遵循尼克的build议。 游乐场链接: http : //play.golang.org/p/RNx_otTFpk

 package main import "fmt" func main() { queue := make(chan struct {string; int}) go sendPair(queue) pair := <-queue fmt.Println(pair.string, pair.int) } func sendPair(queue chan struct {string; int}) { queue <- struct {string; int}{"http:...", 3} } 

匿名结构和字段对于像这样的快速和肮脏的解决scheme是好的。 尽pipe如此,除了最简单的情况之外,你最好还是像你一样定义一个命名结构体。

如果你愿意,你可以做这样的事情

 package main import "fmt" type Pair struct { a, b interface{} } func main() { p1 := Pair{"finished", 42} p2 := Pair{6.1, "hello"} fmt.Println("p1=", p1, "p2=", p2) fmt.Println("p1.b", p1.b) // But to use the values you'll need a type assertion s := p1.a.(string) + " now" fmt.Println("p1.a", s) } 

但是我认为你已经完全习惯了,结构完美地描述你的数据,这比使用简单的元组是一个很大的优势。