Go中的配对/元组数据类型


118

在进行“ 围棋之旅”最后练习时,我决定需要队列(stringint)对。这很容易:

type job struct {
    url string
    depth int
}

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

但这让我开始思考:Go中是否内置了对/元组数据类型?支持从函数返回多个值,但是AFAICT(产生的多个值元组)不是Go的类型系统中的一等公民。是这样吗

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

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

没用。

Answers:


57

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

尼克的答案显示了如何使用进行类似的处理任意类型的操作interface{}。(我可能使用了数组而不是结构来使其像元组一样可索引,但关键思想是interface{}类型)

我的其他答案显示了如何执行类似的操作,避免使用匿名结构创建类型。

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


91

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

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

匿名结构和字段适用于此类快速而肮脏的解决方案。但是,对于除最简单的情况以外的所有情况,最好像定义一样定义命名结构。


9
您可能应该描述如何从匿名struct成员中获取值,因为我认为这对于初学者而言并不明显!
Nick Craig-Wood

9
但是,如果有多个具有相同类型的字段,则将无法使用
newacct 2012年

1
您可以在匿名结构中使用命名字段,只需确保以相同的方式命名字段,每个位置都会出现匿名结构定义(在此示例中为3次)。 。
索尼娅

5
所以答案是“不,没有元组类型”?
弗雷德·富

37

如果需要,您可以执行以下操作

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)
}

但是,我认为您已经完全习惯了,该结构完美地描述了您的数据,这比使用普通元组有很大的优势。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.