2016-10-17 7 views
0

私はマルチlangウェブサイトを作成しています。 私はユーザーのクッキーから言語情報を読みました。en.gogr.goなど モジュールのタイプはmap[string]stringです。ここでの問題はjavacriptです。lang[cookies.lang]["whatever message"].'But go does not support accessing struct members in this way. I could make switch case or map [string] map [string]文字列 `とすべての可能な言語をマップしますが、これは非常に余分な作業です。 golangがjs bracketの表記法のようなメンバーにアクセスする方法を提供していますか? Not:スタックにも同様の質問があり、誰かが "リフレクト"パッケージを使用するよう書いていましたが、それがどのように動作し、自分で再生できなかったのか、自分で再生できなかったのか分かりませんでした。golangのjavascriptのような動的構造体メンバ名

+0

ここに、 'reflect'を使って名前に基づいて構造体値のフィールドにアクセスするいくつかの例を挙げます:[1](http://stackoverflow.com/a/30889373/1705598); [2](http://stackoverflow.com/a/39968350/1705598); [3](http://stackoverflow.com/questions/30913483/golang-sort-struct-fields-in-alphabetical-order/30915092#30915092); [4](http://stackoverflow.com/a/33142636/1705598)。 – icza

+0

人がメモなしでマイナスポイントを与える理由は何ですか?どのように愚かな質問ですか?マイナスに投票した人は私が思うどんな技術にも精通しています – nikoss

+1

@nikossこれは、「JavaScriptをGoに書くにはどうすればいいのですか?」と非常によく似ていると思います。あなたは、異なる能力を持っています。すべてのことで、 'map [string] map [string] string'はGoの正しい解決策だと思っています。構造体を使用したり、動的にパッケージを検索したり、 – Vatine

答えて

1

可能なルートの1つはmap[string]map[string]stringです。

基本翻訳変数を宣言する基本パッケージを用意し、翻訳モジュールでinit関数を使用して、関連するサブマップを作成することができます。別のパッケージとして、または別々のファイルとして扱いたい場合は、基本的にオプションです(パッケージとしては、コンパイル時にどの言語を含めるかを制御することができます)。

あなたはパッケージのルートを行けば、私は次の構造を提案する:

package "base" 
var Lang map[string]map[string]string 

そして、それぞれの言語固有のパッケージで:

package "<language code>" 

import "language/base" 

var code = "<langcode>" 

func init() { 
    d := map[string]string{} 
    d[<phrase1>] = "your translation here" 
    d[<phrase2>] = "another translation here" 
    // Do this for all the translations 
    base.Lang[code] = d 
} 
翻訳/ベースに、その後

translation/base   This is where you export from 
translation/<language> These are "import only" packages 

これをメインプログラムから使用できます。

package "..." 

import (
    "language/base" 
    _ "language/lang1" // We are only interested in side-effects 
    _ "language/lang2" // Same here... 
) 

別個のパッケージを使用していないのは、ほぼ同じです。すべてのファイルが同じパッケージに含まれていることを確認するだけで、Lang変数のパッケージプレフィックスをスキップできます。

おもちゃの例on the Go Playgroundには、すべての "偽装"ビットがインライン化されています。

+0

それは私も思ったことです。私はそれを言いましたが、これは唯一のケースではありません。私はなぜそれが私はupvoted動的な呼び出しが必要ですが、これは正確に答えていないと私はとにかくこれを行うには行く方法です探していますあなたは動的に呼び出すことがたくさんある – nikoss

関連する問題