gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:37 27 4
gpt4 key购买 nike

我正在编写一个多语言网站。我从用户 cookie 中读取语言信息,并且我有几个翻译模块,例如 en.go gr.go 等。这些模块的类型是 map[string]string。这里的问题是在 javascript 中,我可以做类似 lang[cookies.lang]["whatever message"] 的事情。'但是 go 不会支持以这种方式访问​​结构成员。
我可以制作 switch case 或
map[string]map[string]string` 并映射所有可能的语言,但这是很多额外的工作。那么golang有没有办法提供一些方法来访问像js括号表示法这样的成员呢?不是:栈上也有类似的问题,有人写过使用“reflect”包,但是我不太明白它是如何工作的,无法自己复现作品,自己复现失败。

最佳答案

一种可能的方法是使用 map[string]map[string]string

然后您可以有一个基础包,您可以在其中声明您的基础翻译变量,并且在您的翻译模块中,您可以使用 init 函数来填充相关的子 map 。如果您想将其作为单独的包或只是单独的文件来执行此操作,它基本上是可选的(作为包来执行意味着您可以更好地在编译时控制要包含的语言,作为文件来执行可能不会那么困惑)。

如果您进入包根目录,我建议采用以下结构:

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 ,内联了所有“繁琐”的位。

关于oop - 动态结构成员名称,如 golang 中的 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097220/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com