2012-04-12 4 views
2

編集:ジェレミー・ウォールは、私が意図したよりも具体的な質問をしていたことを実感しました。ここにはより良いバージョンがあります。Goで任意の長さの値のシーケンスをマップキーとして使用する方法は?

私は、いくつかのタイプBの値を、等価が定義されているタイプAの値のシーケンスに関連付けるテーブルを表現したいとします。 Goでこれを行う最善の方法は何ですか?

もちろん、テーブルではGoマップを使用したいと思いますが、タイプAの値のシーケンスには何が使えますか?スライスは、Goのマップのキーとして使用することはできません。配列はできますが、配列の長さはその型の一部です。実行時に決定された長さのシーケンスを使用できることに興味があります。 (1)Aの配列を使用して最大長を宣言するか、(2)Aのスライスを使用して文字列にシリアル化してキーとして使用することができます(この手法はAwkとLuaのプログラマーにはよく知られています)。私が説明したものよりもGoのこの「機能」の方が良い方法がありますか?

私はA = intを持っていた質問の私のオリジナルバージョンに答えてJeremy Wallによって指摘されているように、オプション(2)は文字列への変換のためのルーンのスライスを使用できるので、ちょうどキャスト。

+1

私は「」以下の答えましたが、問題は本当につながるにはあまりにも具体的ですどんな種類の答えにも。具体的にあなたが答えようとしている問題を知ることができます。 –

+0

それはあまりにも具体的な問題についての良い点です。私の考えは、具体的な例を与えるためだけに整数を言及することでしたが、他の型ではうまくいかない本当に良い、単純な解決法があるかもしれないとは考えていませんでした。 –

答えて

1

整数の代わりにルーンシーケンスを使用できますか?ルーンがUINT32であり、文字列への変換は単なるキャストです:

package main 

import "fmt" 

type myKey struct { 
    seq []int 
} 

func main() { 
    m := make(map[string]string) 
    key := []rune{1, 2} 
    m[string(key)] = "foo" 
    fmt.Print("lookup: ", m[string(key)]) 
} 

あなたがここにこのコードで遊ぶことができます。http://play.golang.org/p/Kct1dum8A0

+0

ありがとう、それは素敵なトリックです!私が理解していることを確認するために、ここでは変数 "キー"はタイプ_slice_のルーンです、そうですか?これは整数列の場合を完全にカバーしていますが、これは私が書いたプログラムを改良するものですが(与えられた長さのすべての[de Bruijn系列](http://en.wikipedia.org/wiki/De_Bruijn_sequence)を列挙します)私は、より一般的には、必ずしも32ビット整数ではない値のシーケンスについて質問するつもりだった。 –

+0

はいキーはルーンのスライスです。ルーンは符号なし32ビット整数です。あなたの整数のシーケンスがそれに収まるならば、intのスライスに耐えることができます。 –

+0

シーケンスの長さがすべて同じ場合は、最も適切な数値タイプの配列を使用できます。それはスライスではない配列です。配列は有効なマップキーです(制限内...数値型の配列は問題ありません)。スライスよりも少し速いかもしれません。 – Sonia

関連する問題