Próbuję przedstawić uproszczony chromosom, który składa się z N zasad, z których każda może być tylko jedną z nich {A, C, T, G}
.
Chciałbym sformalizować ograniczenia za pomocą wyliczenia, ale zastanawiam się, jaki najbardziej idiomatyczny sposób naśladowania wyliczenia jest w Go.
Odpowiedzi:
Cytowanie ze specyfikacji językowej: Iota
Twój kod może być podobny
lub
jeśli chcesz, aby zasady były odrębnym typem od int.
źródło
Ord(Base)
nie ogranicza się do,0..3
ale ma takie same ograniczenia jak podstawowy typ liczbowy. To wybór języka, kompromis między bezpieczeństwem a wydajnością. Rozważ „bezpieczne” kontrole czasowe za każdym razem, gdy dotykaszBase
wpisanej wartości. Lub jak zdefiniować zachowanie „przepełnienia”Base
wartości dla arytmetyki oraz dla++
i--
? Itd.iota + 1
aby nie zaczynać od 0Odnosząc się do odpowiedzi jnml, możesz zapobiec nowym wystąpieniom typu podstawowego, nie eksportując w ogóle typu podstawowego (tj. Zapisuj go małymi literami). W razie potrzeby możesz utworzyć interfejs do eksportu, który ma metodę zwracającą typ podstawowy. Interfejs ten może być wykorzystywany w funkcjach z zewnątrz, które dotyczą baz, tj
Wewnątrz głównego pakietu
a.Baser
jest teraz faktycznie jak wyliczanka. Tylko w pakiecie możesz definiować nowe instancje.źródło
base
jest używana tylko jako odbiornik metody. Gdyby twója
pakiet ujawnił funkcję przyjmującą parametr typubase
, stałby się niebezpieczny. Rzeczywiście, użytkownik może po prostu wywołać go z wartością dosłowną 42, którą funkcja zaakceptowałaby,base
ponieważ można go rzutować na liczbę całkowitą. Aby temu zapobiec, należy : . Problem: nie można już deklarować baz jako stałych, tylko zmienne modułowe. Ale 42 nigdy nie zostanie obsadzone na tego typu.base
struct
type base struct{value:int}
base
Możesz to zrobić tak:
Za pomocą tego kodu kompilator powinien sprawdzać typ wyliczenia
źródło
To prawda, że powyższe przykłady użycia
const
iiota
są najbardziej idiomatycznymi sposobami reprezentowania prymitywnych wyliczeń w Go. Ale co, jeśli szukasz sposobu na stworzenie w pełni funkcjonalnego wyliczenia podobnego do typu, który można zobaczyć w innym języku, takim jak Java lub Python?Bardzo prostym sposobem na utworzenie obiektu, który zaczyna wyglądać i zachowywać się jak wyliczenie ciągu w Pythonie, byłoby:
Załóżmy, że chciałeś także mieć kilka metod narzędziowych, takich jak
Colors.List()
iColors.Parse("red")
. A twoje kolory były bardziej złożone i musiały być strukturą. Następnie możesz zrobić coś takiego:W tym momencie na pewno działa, ale może ci się nie podobać powtarzalne definiowanie kolorów. Jeśli w tym momencie chcesz to wyeliminować, możesz użyć tagów na swojej strukturze i zrobić trochę wymyślnego zastanowienia, aby to skonfigurować, ale mam nadzieję, że to wystarczy, aby pokryć większość ludzi.
źródło
Począwszy od wersji 1.4
go generate
narzędzie zostało wprowadzone wraz zstringer
poleceniem, które sprawia, że wyliczanie jest łatwe do debugowania i drukowania.źródło
Jestem pewien, że mamy tutaj wiele dobrych odpowiedzi. Ale właśnie pomyślałem o dodaniu sposobu, w jaki użyłem typów wyliczonych
Jest to zdecydowanie jeden z idiomatycznych sposobów, w jaki moglibyśmy tworzyć typy wyliczone i używać ich w Go.
Edytować:
Dodanie innego sposobu użycia stałych do wyliczenia
źródło
Oto przykład, który okaże się przydatny, gdy istnieje wiele wyliczeń. Korzysta ze struktur w Golang i czerpie z Object Oriented Principles, aby związać je wszystkie razem w zgrabny mały pakiet. Żaden z podstawowych kodów nie zmieni się, gdy nowe wyliczenie zostanie dodane lub usunięte. Proces jest następujący:
enumeration items
: EnumItem . Ma liczbę całkowitą i ciąg znaków.enumeration
jako listęenumeration items
: Enumenum.Name(index int)
: zwraca nazwę dla podanego indeksu.enum.Index(name string)
: zwraca nazwę dla podanego indeksu.enum.Last()
: zwraca indeks i nazwę ostatniego wyliczeniaOto kod:
źródło