在PHP中我们可以做类似的事情:
if ($env == "dev")
define("key", "key")
else
define("key", "secret")
// json ouput
//{ key : "value" } or { secret : "value" }
如何正确地将上述PHP方法转换为GO?
我想的是:
if *env == "dev" {
type response struct {
key string
...50 more keys that should also be different depending on env
}
} else {
secret string
...50 more keys...
}
但我想这不仅是错误的,而且会产生巨大的重复代码......
答案 0 :(得分:2)
您可以创建一个包含数据结构公共部分的结构类型,并且可以创建新类型嵌入,并且只添加偏离的新字段。因此,数据结构的公共部分没有代码重复:
type Response struct {
F1 string
F2 int
}
func main() {
for _, env := range []string{"dev", "prod"} {
if env == "dev" {
type Resp struct {
Response
Key string
}
r := Resp{Response{"f1dev", 1}, "value"}
json.NewEncoder(os.Stdout).Encode(r)
} else {
type Resp struct {
Response
Secret string
}
r := Resp{Response{"f1pro", 2}, "value"}
json.NewEncoder(os.Stdout).Encode(r)
}
}
}
输出(在Go Playground上尝试):
{"F1":"f1dev","F2":1,"Key":"value"}
{"F1":"f1pro","F2":2,"Secret":"value"}
请注意,如果两个用例的值相同,您也可以使用相同的Response
值:
comResp := Response{"f1value", 1}
if env == "dev" {
type Resp struct {
Response
Key string
}
r := Resp{comResp, "value"}
json.NewEncoder(os.Stdout).Encode(r)
} else {
type Resp struct {
Response
Secret string
}
r := Resp{comResp, "value"}
json.NewEncoder(os.Stdout).Encode(r)
}
您可以使用匿名结构来缩短上面的代码,而不是创建局部变量(不一定更具可读性):
if env == "dev" {
json.NewEncoder(os.Stdout).Encode(struct {
Response
Key string
}{comResp, "value"})
} else {
json.NewEncoder(os.Stdout).Encode(struct {
Response
Secret string
}{comResp, "value"})
}
答案 1 :(得分:0)
使用变量:
var key = "secret"
if env == "dev" {
key = "dev"
}
在创建要序列化为JSON的地图时使用该变量:
m := map[string]interface{}{key: "value"}
p, err := json.Marshal(m)
if err != nil {
// handle error
}
// p contains the json value.
答案 2 :(得分:0)
这个问题的答案取决于您的实际使用案例。以下是实现您要求的3种方法:
textField.placeholder = phoneNumberString
代替struct