Ich versuche, ein vereinfachtes Chromosom darzustellen, das aus N Basen besteht, von denen jede nur eine sein kann {A, C, T, G}
.
Ich möchte die Einschränkungen mit einer Aufzählung formalisieren, aber ich frage mich, was die idiomatischste Art ist, eine Aufzählung zu emulieren, in Go.
Antworten:
Zitat aus den Sprachspezifikationen: Iota
Ihr Code könnte also so sein
oder
Wenn Sie möchten, dass Basen ein separater Typ von int sind.
quelle
Ord(Base)
ist daher nicht auf0..3
den zugrunde liegenden numerischen Typ beschränkt, sondern hat dieselben Grenzen. Es ist eine Wahl für das Sprachdesign, ein Kompromiss zwischen Sicherheit und Leistung. Berücksichtigen Sie beim Berühren einesBase
eingegebenen Werts jedes Mal "sichere" Überprüfungen zur Laufzeit . Oder wie soll man das Überlaufverhalten vonBase
Wert für Arithmetik und für++
und definieren--
? Etc.iota + 1
um nicht bei 0 zu beginnen.In Bezug auf die Antwort von jnml können Sie neue Instanzen des Basistyps verhindern, indem Sie den Basistyp überhaupt nicht exportieren (dh in Kleinbuchstaben schreiben). Bei Bedarf können Sie eine exportierbare Schnittstelle erstellen, die über eine Methode verfügt, die einen Basistyp zurückgibt. Diese Schnittstelle könnte in Funktionen von außen verwendet werden, die sich mit Basen befassen, d. H.
Das
a.Baser
Hauptpaket ist jetzt praktisch wie eine Aufzählung. Nur innerhalb eines Pakets können Sie neue Instanzen definieren.quelle
base
sie nur als Methodenempfänger verwendet wird. Wenn Ihra
Paket eine Funktion mit einem Parameter vom Typ verfügbar machtbase
, wird dies gefährlich. In der Tat könnte der Benutzer es einfach mit dem Literalwert 42 aufrufen, den die Funktion akzeptieren würde,base
da er in ein int umgewandelt werden kann. Um dies zu verhindern, machen Siebase
einstruct
:type base struct{value:int}
. Problem: Sie können keine Basen mehr als Konstanten deklarieren, sondern nur noch Modulvariablen. Aber 42 werden niemals zu einembase
solchen Typ gegossen .Sie können es so machen:
Mit diesem Code sollte der Compiler den Aufzählungstyp überprüfen
quelle
Es ist wahr, dass die obigen Beispiele für die Verwendung
const
undiota
die idiomatischsten Arten der Darstellung primitiver Aufzählungen in Go sind. Aber was ist, wenn Sie nach einer Möglichkeit suchen, eine umfassendere Aufzählung zu erstellen, die dem Typ ähnelt, den Sie in einer anderen Sprache wie Java oder Python sehen würden?Eine sehr einfache Möglichkeit, ein Objekt zu erstellen, das in Python wie eine Zeichenfolgenaufzählung aussieht und sich anfühlt, ist:
Angenommen, Sie wollten auch einige Dienstprogrammmethoden wie
Colors.List()
undColors.Parse("red")
. Und Ihre Farben waren komplexer und mussten eine Struktur sein. Dann könnten Sie so etwas machen:An diesem Punkt funktioniert es zwar sicher, aber es gefällt Ihnen möglicherweise nicht, wie Sie Farben wiederholt definieren müssen. Wenn Sie dies an dieser Stelle beseitigen möchten, können Sie Tags für Ihre Struktur verwenden und ausgefallene Überlegungen anstellen, um sie einzurichten. Hoffentlich reicht dies jedoch aus, um die meisten Personen abzudecken.
quelle
Ab Go 1.4 wurde das
go generate
Tool zusammen mit demstringer
Befehl eingeführt, mit dem Ihre Enumeration leicht debuggbar und druckbar ist.quelle
Ich bin sicher, wir haben hier viele gute Antworten. Aber ich dachte nur daran, die Art und Weise hinzuzufügen, wie ich aufgezählte Typen verwendet habe
Dies ist bei weitem eine der idiomatischen Möglichkeiten, wie wir Aufzählungstypen erstellen und in Go verwenden können.
Bearbeiten:
Hinzufügen einer anderen Möglichkeit, Konstanten zum Aufzählen zu verwenden
quelle
Hier ist ein Beispiel, das sich bei vielen Aufzählungen als nützlich erweisen wird. Es verwendet Strukturen in Golang und stützt sich auf objektorientierte Prinzipien, um sie alle in einem ordentlichen kleinen Bündel zusammenzubinden. Keiner der zugrunde liegenden Codes ändert sich, wenn eine neue Aufzählung hinzugefügt oder gelöscht wird. Der Prozess ist:
enumeration items
: EnumItem . Es hat einen Integer- und einen String-Typ.enumeration
als Liste vonenumeration items
: Enumenum.Name(index int)
: Gibt den Namen für den angegebenen Index zurück.enum.Index(name string)
: Gibt den Namen für den angegebenen Index zurück.enum.Last()
: Gibt den Index und den Namen der letzten Aufzählung zurückHier ist ein Code:
quelle