在进行Go 之旅的最后练习时,我决定我需要一个 ( string, int) 对的队列。这很容易:
string
int
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))
没有用。
Go中没有元组类型,你是对的,函数返回的多个值并不代表一等对象。
Nick 的回答展示了如何使用interface{}. (我可能使用数组而不是结构来使它像元组一样可索引,但关键思想是interface{}类型)
interface{}
我的另一个答案展示了如何做类似的事情来避免使用匿名结构创建类型。
这些技术具有元组的一些特性,但不,它们不是元组。
你可以这样做。它看起来比元组更冗长,但这是一个很大的改进,因为您可以进行类型检查。
编辑:按照尼克的建议,用完整的工作示例替换了片段。游乐场链接: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} }
匿名结构和字段适用于像这样的快速和肮脏的解决方案。除了最简单的情况外,您最好像以前一样定义一个命名结构。