Saya mencoba mewakili kromosom yang disederhanakan, yang terdiri dari basa N, yang masing-masing hanya bisa satu {A, C, T, G}
.
Saya ingin memformalkan kendala dengan enum, tapi saya bertanya-tanya apa cara yang paling idiomatis untuk meniru enum di Go.
Jawaban:
Mengutip dari spesifikasi bahasa: Iota
Jadi kode Anda mungkin seperti
atau
jika Anda ingin basis menjadi tipe terpisah dari int.
sumber
Ord(Base)
tidak terbatas pada0..3
tetapi memiliki batas yang sama dengan tipe numerik yang mendasarinya. Ini adalah pilihan desain bahasa, kompromi antara keselamatan dan kinerja. Pertimbangkan pemeriksaan batas waktu berjalan "aman" setiap kali ketika menyentuhBase
nilai yang diketik. Atau bagaimana seseorang harus mendefinisikan perilaku 'luapan'Base
nilai untuk aritmatika dan untuk++
dan--
? Dlliota + 1
untuk tidak memulai pada 0.Mengacu pada jawaban jnml, Anda dapat mencegah instance baru tipe Base dengan tidak mengekspor tipe Base sama sekali (yaitu, menulisnya dengan huruf kecil). Jika perlu, Anda dapat membuat antarmuka yang dapat diekspor yang memiliki metode yang mengembalikan tipe dasar. Antarmuka ini dapat digunakan dalam fungsi-fungsi dari luar yang berhubungan dengan Basa, yaitu
Di dalam paket utama
a.Baser
efektif seperti enum sekarang. Hanya di dalam paket Anda dapat menentukan contoh baru.sumber
base
hanya digunakan sebagai penerima metode. Jikaa
paket Anda mengekspos fungsi mengambil parameter tipebase
, maka itu akan menjadi berbahaya. Memang, pengguna hanya bisa menyebutnya dengan nilai literal 42, yang fungsi akan terimabase
karena dapat dicor ke int. Untuk mencegah hal ini, membuatbase
sebuahstruct
:type base struct{value:int}
. Masalah: Anda tidak dapat mendeklarasikan basis sebagai konstanta lagi, hanya variabel modul. Tetapi 42 tidak akan pernah dilemparkan kebase
tipe seperti itu.Anda bisa membuatnya:
Dengan kode ini kompiler harus memeriksa jenis enum
sumber
Memang benar bahwa contoh-contoh penggunaan di atas
const
daniota
merupakan cara paling idiomatis untuk mewakili enum primitif di Go. Tetapi bagaimana jika Anda sedang mencari cara untuk membuat enum yang lebih berfitur lengkap mirip dengan jenis yang akan Anda lihat dalam bahasa lain seperti Java atau Python?Cara yang sangat sederhana untuk membuat objek yang mulai terlihat dan terasa seperti string enum dengan Python adalah:
Misalkan Anda juga menginginkan beberapa metode utilitas, seperti
Colors.List()
, danColors.Parse("red")
. Dan warna Anda lebih kompleks dan perlu menjadi struct. Maka Anda mungkin melakukan sesuatu yang sedikit seperti ini:Pada titik itu, pasti berhasil, tetapi Anda mungkin tidak suka bagaimana Anda harus mendefinisikan warna secara berulang. Jika pada titik ini Anda ingin menghilangkan itu, Anda dapat menggunakan tag pada struct Anda dan melakukan beberapa perenungan untuk mengaturnya, tetapi mudah-mudahan ini cukup untuk menutupi sebagian besar orang.
sumber
Mulai Go 1.4,
go generate
alat ini telah diperkenalkan bersama denganstringer
perintah yang membuat enum Anda mudah disangkal dan dapat dicetak.sumber
Saya yakin kami punya banyak jawaban bagus di sini. Tapi, saya hanya berpikir untuk menambahkan cara saya menggunakan tipe yang disebutkan
Sejauh ini, ini adalah salah satu cara idiomatis yang bisa kita buat dengan tipe yang ditentukan dan digunakan di Go.
Edit:
Menambahkan cara lain menggunakan konstanta untuk menghitung
sumber
Berikut adalah contoh yang akan terbukti bermanfaat ketika ada banyak enumerasi. Ia menggunakan struktur di Golang, dan menggunakan Prinsip Berorientasi Objek untuk mengikat mereka semua dalam satu bungkusan kecil yang rapi. Tidak satu pun dari kode yang mendasarinya akan berubah ketika enumerasi baru ditambahkan atau dihapus. Prosesnya adalah:
enumeration items
: EnumItem . Ini memiliki tipe integer dan string.enumeration
sebagai daftarenumeration items
: Enumenum.Name(index int)
: mengembalikan nama untuk indeks yang diberikan.enum.Index(name string)
: mengembalikan nama untuk indeks yang diberikan.enum.Last()
: mengembalikan indeks dan nama enumerasi terakhirIni beberapa kode:
sumber