2016-05-03 4 views
0

In PHP wir so etwas wie tun:Golang Konstante struct Schlüssel

if ($env == "dev") 
    define("key", "key") 
else 
    define("key", "secret") 

// json ouput 
//{ key : "value" } or { secret : "value" } 

Wie richtig ich über PHP Ansatz übersetzen zu gehen?

Ich dachte an so etwas wie:

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... 
} 

Aber ich denke, dass nicht nur falsch ist, sondern würde auch einen großen wiederholten Code erstellen ...

Antwort

2

Sie können eine Strukturtyp erstellen den gemeinsamen Teil Ihrer Datenstruktur zu halten, und Sie können neue Typen erstellen diese Einbettung und nur das Hinzufügen der abweichenden neues Feld. So gibt es keinen Code Wiederholung des gemeinsamen Teils der Datenstruktur:

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) 
     } 
    } 
} 

Output (versuchen Sie es auf dem Go Playground):

{"F1":"f1dev","F2":1,"Key":"value"} 
{"F1":"f1pro","F2":2,"Secret":"value"} 

Beachten Sie, dass Sie auch die gleiche Response Wert verwenden können, wenn sie sind die gleichen für die 2 Anwendungsfälle:

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) 
} 

Sie anonyme Struktur durch Verwendung und nicht eine lokale Variable (nicht unbedingt mehr r die Erstellung des Codes oben verkürzen eadable):

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"}) 
} 
0

Verwenden Sie eine Variable:

var key = "secret" 
if env == "dev" { 
    key = "dev" 
} 

Verwenden Sie diese Variable, wenn Sie eine Karte erstellen, die zu JSON serialisiert werden soll:

m := map[string]interface{}{key: "value"} 
p, err := json.Marshal(m) 
if err != nil { 
    // handle error 
} 
// p contains the json value. 

playground example

+0

gibt es einen besseren Weg? Ich habe innere Strukturen. – majidarif

0

Die Antwort auf diese Frage hängt von Ihrem tatsächlichen Anwendungsfall ab. Hier sind 3 Möglichkeiten zu erreichen, was Sie fragen:

  1. Verwenden map[string]interface{} statt struct
  2. Verwenden Sie unterschiedliche Strukturtypen (wie im Beispiel von der Frage)
  3. Verwenden Sie einen einzelner Strukturtyp, die Felder für beide enthält "dev" und "prod" -Umgebungen verwenden Sie "json:, omitemperty" und füllen Sie nur die notwendigen Felder auf, bevor Sie zu JSON marshallen.
+0

Ich dachte an 2 und 3, aber es scheint ein bisschen dreckig. 1 würde nicht funktionieren, weil ich innere Strukturen habe, die innere Strukturen haben, die je nach Umgebung auch einen Schlüsselwechsel erfordern. auch, einige davon sind db-ergebnis. – majidarif

+0

Ich stimme zu, dass weder 2 noch 3 besonders schön ist. Aber Ihre Anforderung klingt auch nicht sauber. Aus meiner Erfahrung mit verschiedenen Verhalten in Dev und Prod ist eine Quittung für das Desaster;) – kostya

+0

Eigentlich ist dies die json Antwort zu verschleiern. Wie bei einem Schlüssel, der "user_info" sagt, ist es eine zufällige Zeichenfolge bei der Produktion. Dies ist für ein Spiel api. Und ja, der JSON ist dann verschlüsselt. – majidarif

Verwandte Themen