gpt4 book ai didi

go - 试图理解 Golang 多元化

转载 作者:IT王子 更新时间:2023-10-29 02:37:20 25 4
gpt4 key购买 nike

我正在尝试理解 Go 中的多元化。文档中的示例 https://godoc.org/golang.org/x/text/message/catalog#hdr-String_interpolation不起作用。 plural.Select 方法不存在。它应该是 plural.Selectf。请注意末尾的 f

message.Set(language.English, "You are %d minute(s) late.",
catalog.Var("minutes", plural.Selectf(1, "one", "minute")),
catalog.String("You are %d ${minutes} late."))
p := message.NewPrinter(language.English)
p.Printf("You are %d minute(s) late.", 5)

我在这里找到了另一个教程 https://phraseapp.com/blog/posts/internationalization-i18n-go/ .此代码工作正常

message.Set(language.English, "You have %d problem",
catalog.Var("minutes", plural.Selectf(1, "%d", "one", "minute", "other", "minutes")),
catalog.String("You are %d ${minutes} late."))
printer := message.NewPrinter(language.English)
printer.Printf("You have %d problem", 1)
printer.Println()
printer.Printf("You have %d problem", 3)
printer.Println()

// result
// You are 1 minute late.
// You are 3 minutes late.

两个示例都使用高级字符串插值。现在我试图理解 plural.Selectf。第一个参数 1 在做什么?为什么我需要第二个参数 %d?我想我明白了剩下的

"one"  : "minute"
"other": "minutes"

我还在 catalog.String 中看到了 %[1]d。这是做什么的?

非常感谢!我现在非常困惑。

最佳答案

给你!

plural.Selectf 的第一个参数是一个 int。所以它可以是任何有效的整数。第二个参数是一个字符串。它应该是一个格式动词,即 %d%s%f第三个参数是一个空接口(interface),可以接收任何类型,即字符串、结构、catalog.Message、..

让我们举个例子,

func main() {

var (
msg = plural.Selectf(2, "%d",
"=10", "%[1]d task and %[2]d processes remaining!", // interface 1
"=1", "%[1]d task and %[2]d processes", // interface 2
"other", "%d tasks and %d processes!" // interface 3
)
key = "%d task - %d process"
tag = "en"
)

lTag := language.MustParse(tag)
message.Set(lTag, key, msg)

p := message.NewPrinter(language.English)
p.Printf("%d task - %d process", 1, 10)

}

在这里,我们创建了一个语言为英语的 NewPrinter,并使用 %d task(s) remaining! 标签 en (英语语言的短代码)。

p.Printf("%d task - %d process", 1, 3) 行执行时,转换机制采用第一个参数(格式说明符)即 %d task - %d 处理 并通过与我们为 en 标签设置的键进行比较来检查消息。如果找到 key ,则它会处理消息,即 msg

这里 Selectf 的第一个参数表示从 Printf(即 10 in %d 的第二个值)并与案例选择器进行比较,即案例 1(接口(interface) 1)中的 =10。如果比较成功,则返回处理后的值,即 1 个任务和 10 个进程,在情况 1 中。

如果 Printf 接收到 2nd %d 的值而不是 1 和 10,那么它将返回案例 3(接口(interface) 3)中的值

还有,

%[n]d 可以这样使用,

fmt.Printf("%[2]d %[1]d\n", 11, 22) 并打印 22 11

希望,这对你有帮助。

关于go - 试图理解 Golang 多元化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51395452/

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