动态结构成员名称,如golang中的javascript

时间:2016-10-17 23:28:44

标签: oop object go struct notation

我正在写一个多语言的网站。 我从用户cookie中读取了语言信息,我有几个翻译模块,例如en.go gr.go等。 这些模块的类型为map[string]string。这里的问题在于javascript我可以做类似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] string`的事情并映射所有可能的语言,但这是额外的工作。 那么golang是否提供了一些方法来访问js括号表示法等成员? 不是:堆栈上有一个类似的问题,有人写信使用"反映"包,但我不太明白它是如何工作的,也不能自己复制作品,也不能自己复制。

1 个答案:

答案 0 :(得分:1)

一种可能的途径是使用map[string]map[string]string

然后您可以在其中声明基本翻译变量的基础包,并且在翻译模块中,您可以使用init函数填充相关的子地图。它本质上是可选的,如果你想将它作为单独的包或只是单独的文件(以包为单位进行操作意味着你有更好的编译时控制包含哪些语言,作为文件执行它可能不那么混乱)。 / p>

如果你去包根,我建议采用以下结构:

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

然后,在翻译/基地:

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
}

然后你可以在主程序中使用它:

package "..."

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

不使用单独的包(几乎)是相同的。您只需确保所有文件都在同一个包中,您就可以跳过Lang变量的包前缀。

一个玩具示例on the Go Playground,所有&#34; fiddly&#34;位内联。