Go中的Pair / tuple数据类型

时间:2012-12-02 15:43:01

标签: go tuples

在执行final exercise of the Tour of Go时,我决定需要(stringint)对的队列。这很容易:

type job struct {
    url string
    depth int
}

queue := make(chan job)
queue <- job{url, depth}

但这让我想到:Go中是否有内置的对/元组数据类型?函数中支持returning multiple values,但AFAICT,生成的多值元组不是Go类型系统中的一等公民。是这样的吗?

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

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

没用。

3 个答案:

答案 0 :(得分:73)

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

编辑:根据尼克的建议,用完整的工作示例替换了代码段。游乐场链接: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}
}

对于像这样的快速和肮脏的解决方案,匿名结构和字段很好。除了最简单的情况之外,你最好定义一个命名结构,就像你一样。

答案 1 :(得分:44)

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

Nick的回答显示了如何使用interface{}执行类似处理任意类型的操作。 (我可能使用数组而不是结构使其像元组一样可转换,但关键的想法是interface{}类型)

我的另一个答案显示了你可以做些类似的事情,避免使用匿名结构创建一个类型。

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

答案 2 :(得分:24)

如果你想要

,你可以这样做
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)
}

然而,我认为你已经完全不是惯用语,结构完美地描述了你的数据,这比使用普通元组更有优势。