2017-02-02 2 views
2

Ich fange an zu lernen Go nach anderen Sprachen. Go hat eine sehr elegant way of creating constants mit numerischen Werten wie:Die beste Methode zum Aufzählen von Konstanten in Go

const (
    _  = iota // 0 and is skipped 
    Sunday   // 1 
    Monday   // 2 
    ... 
) 

Dies ist sehr einfach zu schreiben, aber es ist wirklich einfach zu warten? Wenn Sie z. B. plötzlich einen neuen Wert zwischen "vorhanden" einfügen, ändern alle nachfolgenden Werte ihre Werte. Und es wird schwer zu finden sein, nur peinliches Diff-Lesen kann es offenbaren. Oder Fehler an anderen Teilen. Wie kann ich diese Werte mit Namen extrahieren und in anderen Teilen eines Programms oder in der Datenbank verwenden? Zum Beispiel für PostgreSQL kann ich definieren:

CREATE TYPE color AS ENUM ('', 'Sunday', 'Monday'); 

nur eine Idee zu illustrieren. Zum Beispiel Python has Enum Typ:

from enum import Enum 
class Color(Enum): 
    RED = 1 
    GREEN = 2 
    BLUE = 3 

Dann können Sie es wie Color.RED verwenden. Weiter kann ich alle Werte annehmen:

list(Color) 
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>] 

Das bin ich „introspect“ Modul und erstellen leicht lesbare Aufzählungen in Datenbanken ermöglicht. Zum Beispiel für PostgreSQL kann ich definieren:

CREATE TYPE color AS ENUM ('RED', 'GREEN', 'BLUE'); 

Wie kann ich:

  1. Gelegt golang Konstanten Namen?
  2. Fehlerhafte Konstanten, die ihre Werte nicht abweichen lassen können? Nur manuell beheben?
  3. Vielleicht gibt es einen idiomatischen Weg, es besser zu machen?

Danke.

+1

Der Wert sollte nicht wichtig sein, wenn sie sich ändern, weil Sie die Konstanten _only_ namentlich verwenden sollten. Das ist ein Hauptgrund dafür, die Konstanten so zu deklarieren, anstatt die Literalwerte zu verwenden. – JimB

+0

Ja, während alle Werte in einem Programm sind, spielen sie keine Rolle. Aber ich möchte sie in anderen verwenden, und deshalb muss ich einige numerische Werte übersetzen. Sobald ich sie benutzt habe, kann ich sie nicht ändern. Oder versuchen Sie total Zahlen zu vermeiden und nur an Strings zu hängen? Thx –

Antwort

3

1) Sie können Stringer verwenden, um die Namen zu erzeugen https://godoc.org/golang.org/x/tools/cmd/stringer

2) Nicht sicher, was du meinst? In den meisten Sprachen können Sie Werte driften lassen. Sie sollten immer am Ende der Liste hinzufügen, wenn Sie möchten, dass die Zahl konstant bleibt, oder wie in Python können Sie jeden Wert explizit auf eine Zahl setzen, anstatt Iota zu verwenden.

3) Nicht wirklich, Aufzählungen sind einfach nicht groß in golang

+0

Danke. 2) Ich meine eine Möglichkeit, Konstanten nicht ihre Werte zu ändern, wenn der neue Entwickler plötzlich Wert nicht am Ende eingefügt. –

+0

yeah, stellen Sie entweder sicher, dass sie am Ende der Liste hinzugefügt werden oder setzen Sie sie explizit auf einen Wert, anstatt Iota zu verwenden –

1

Nur einen Vorschlag, sondern etwas, das in Ihrem Fall helfen kann: Ich finde, dass Konstanten ist weniger wahrscheinlich später geändert/gebrochen werden, wenn es klar, dass die Werte Bitmasken aussehen, die Sie wie so in gehen kann:

const (
    Red = 1 << iota 
    Green 
    Blue 
) // values = 1, 2, 4 

Und, obwohl es nicht das schönste von Erklärungen ist, können Sie die Maske Konstanten sind auch

const (
    Red, RedMask = 1 << iota, 1<< iota - 1 // Red = 1, RedMask = 0 
    Green, GreenMask      // Green = 2, mask = 1 
    Blue, BlueMask       // 4, 3 
    RGB, RGBMask       // 8, 7 
) 
Diese 0

, gekoppelt mit einem bestimmten type für diese Konstanten könnten nützlich sein:

type ColourConst int 
const (
    Red, RMask ColourConst = 1 << iota, 1 << iota-1 
    // ... 
    _, All 
) 

// something like this (untested, might not be correct) 
func (c ColourConst) validate() error { 
    mask := int(c) & (-1 * int(c)) 
    if mask != int(c) { 
     return errors.New("Colour is not a single bit value") 
    } 
    if s := c & All; s != c { 
     return errors.New("Colour is not in range") 
    } 
} 

Ich weiß, dass die Tage der Woche unwahrscheinlich sind als Bitmasken verwendet werden, aber es macht es weniger wahrscheinlich, dass für Menschen, die brechen Code. Zumindest kommuniziert es, dass die Reihenfolge der Konstanten wichtig ist, das ist, was iota IMO tut.

0

Lösung. Es gibt ausgezeichnete Module Enumer und Enumeliner

Verwandte Themen