Rumah > Artikel > pembangunan bahagian belakang > Analisis ringkas tentang cara melaksanakan penghitungan di Golang (dengan kod)
Bagaimana untuk melaksanakan penghitungan di Golang? Artikel berikut akan memperkenalkan kepada anda kaedah melaksanakan enumerasi dalam Golang Saya harap ia akan membantu anda!
Dalam bidang pengaturcaraan, penghitungan digunakan untuk mewakili jenis yang mengandungi hanya bilangan nilai tetap yang terhad Ia biasanya digunakan dalam pembangunan untuk mengenal pasti kod ralat atau mesin keadaan . Ambil mesin keadaan objek entiti sebagai contoh Ia biasanya sepadan dengan nilai medan yang mengenal pasti keadaan rekod sepadan objek ini dalam pangkalan data. [Cadangan berkaitan: Go Video Tutorial]
Apabila anda mula belajar pengaturcaraan, anda mesti telah menulis atau sekurang-kurangnya melihat kod yang secara langsung menggunakan nombor ajaib untuk membuat pertimbangan. Apakah itu nombor ajaib? Contohnya, apabila anda ingin menyematkan artikel ke bahagian atas, anda mesti terlebih dahulu menentukan sama ada artikel itu telah diterbitkan.
if (article.state == 2) { // state 2 代表文章已发布 }
Jika tiada ulasan dalam kod kami, atau apabila kod projek kami penuh dengan pertimbangan nombor ajaib ini, adakah anda akan sakit kepala?
Kemudian saya belajar untuk mentakrifkan nilai status ini sebagai pemalar, dan juga membangunkan kaedah untuk menentukan status objek untuk merangkum logik ini secara berasingan.
public class ArticleState { public static final int Draft = 1; //草稿 public static final int Published = 2; //发布 public static final int Deleted = 3; // 已删除 } public Boolean checkArticleState(int state) { ... }
Penggunaan ini pastinya jauh lebih baik daripada terus menggunakan nombor ajaib untuk membuat pertimbangan dalam program Sekurang-kurangnya ia tidak akan memberi anda sakit kepala atau ingin mengutuk.
Namun, abang besar yang membawa saya ke sana kemudiannya berkata bahawa kaedah ini juga mempunyai kekurangan Kaedah checkArticleState di atas digunakan untuk menyemak status artikel Niat asal adalah untuk membiarkan pemanggil lulus dalam salah satu daripada tiga pemalar statik bagi ArticleState, tetapi kerana tiada kekangan Jenis, jadi menghantar sebarang nilai int secara sintaksis dibenarkan, dan pengkompil tidak akan mengeluarkan sebarang amaran. Adalah lebih sesuai untuk menggunakan penghitungan.
em~! Saya tidak ingat cikgu bercakap tentang perkara ini semasa saya mengajar Java di kolej. Mungkinkah ia satu lagi ilmu yang saya terlepas semasa bermain telefon bimbit saya di dalam kelas? Jadi selepas menggunakan penghitungan, kod Java kami menjadi:
// 使用enum而非class声明 public enum ArticleState { //要在enum里创建所有的枚举对象 Draft(1, "草稿"); Published(2, "已发布"); Deleted(3, "已删除") // 自定义属性 private int code; private String text; // 构造方法必须是private的 ArticleState(int code, String text) { this.code = id; this.text = name; } } public Boolean checkArticleState(ArticleState state) { ... }
Dengan cara ini, jenis penghitungan parameter formal boleh membantu kami menapis nilai keadaan tidak sah, dan menghantar nilai integer sebagai parameter untuk menyemakArticleState The kaedah tidak boleh disusun kerana jenis tidak sepadan, dan pengkompil boleh menggesanya dengan segera apabila menulis kod.
Jika anda tidak pernah menggunakan Java sebelum ini, jangan risau saya telah menandai perkara tatabahasa utama dengan ulasan, dan semua orang seharusnya dapat memahaminya.
Dalam dua tahun yang lalu, saya menggunakan Go untuk melakukan projek. Saya mendapati masalah yang sama wujud dalam Go, tetapi Go tidak menyediakan jenis penghitungan. Jadi, bagaimana untuk mengehadkan nilai status dengan betul. Ia pasti tidak akan berfungsi jika anda masih menggunakan pemalar jenis int. Contohnya:
const ( Draft int = 1 Published = 2 Deleted = 3 ) const ( Summer int = 1 Autumn = 2 Winter = 3 Spring = 4 ) func main() { // 输出 true, 不会有任何编译错误 fmt.Println(Autumn == Draft) }
Sebagai contoh, dua set pemalar jenis int ditakrifkan di atas, satu mewakili status artikel dan satu lagi mewakili musim. Tidak akan ada ralat penyusunan apabila membandingkan status artikel dengan musim dengan cara ini.
Jawapannya boleh didapati dalam kod perpustakaan terbina dalam Go atau beberapa perpustakaan sumber terbuka yang kita semua tahu. Contohnya, jika anda melihat cara kod ralat gRPC ditakrifkan dalam google.golang.org/grpc/codes, anda boleh memahami cara melaksanakan penghitungan dengan betul.
Kita boleh menggunakan int sebagai jenis asas untuk mencipta jenis alias Go menyokong ini
type Season int const ( Summer Season = 1 Autumn = 2 Winter = 3 Spring = 4 )
Sudah tentu, apabila mentakrifkan nilai pemalar berterusan, iota sering digunakan dalam Go, jadi di atas Definisi boleh dipermudahkan lagi.
type Season int const ( Summer Season = iota + 1 Autumn Winter Spring ) type ArticleState int const ( Draft int = iota + 1 Published Deleted ) func checkArticleState(state ArticleState) bool { // ... } func main() { // 两个操作数类型不匹配,编译错误 fmt.Println(Autumn == Draft) // 参数类型不匹配,但是因为 ArticleState 底层的类型是 int 所以传递 int 的时候会发生隐式类型转换,所以不会报错 checkArticleState(100) }
Walaupun jenis asas nilai status ini adalah semua nilai int, membandingkan nilai penghitungan dua jenis yang tidak berkaitan akan menyebabkan ralat kompilasi, kerana kini kami menggunakan nilai status di mana-mana sahaja sekatan jenis.
Walau bagaimanapun, jenis parameter fungsi checkArticleState ditetapkan kepada ArticleState kerana jenis asas ArticleState ialah int. Oleh itu, apabila memanggil checkArticleState, menghantar parameter jenis int akan menyebabkan penukaran jenis tersirat dan tidak akan menyebabkan ralat kompilasi Jika anda ingin menyelesaikan masalah ini, anda hanya boleh mentakrifkan semula jenis untuk mencapainya boleh merujuk kepada StackOverflow Jawapan ini:
https://stackoverflow.com/questions/50826100/how-to-disable-implicit-type-conversion-for-constants! !Lagi berkaitan pengaturcaraan Untuk pengetahuan, sila layari:
Video Pengaturcaraan
Atas ialah kandungan terperinci Analisis ringkas tentang cara melaksanakan penghitungan di Golang (dengan kod). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!