Konstanta Go
Nilai konstanta tidak dapat diubah saat runtime setelah diberikan nilai tidak dapat dimodifikasi nilainya hanya dapat berasal dari
- Literal
- Identifier konstanta lain
- Ekspresi konstanta
- Konversi tipe yang hasilnya adalah konstanta
- iota
Konstanta hanya dapat berupa tipe data dasar tidak dapat berupa
- Tipe lain selain tipe dasar seperti struct interface slice array dll
- Nilai pengembalian fungsi
Nilai konstanta tidak dapat dimodifikasi jika tidak tidak akan bisa dikompilasi
Inisialisasi
Deklarasi konstanta memerlukan kata kunci const konstanta saat dideklarasikan harus diinisialisasi dengan nilai dan tipe konstanta dapat dihilangkan misalnya
const name string = "Jack" // literal
const msg = "hello world" // literal
const num = 1 // literal
const numExpression = (1+2+3) / 2 % 100 + num // ekspresi konstantaJika hanya mendeklarasikan tanpa menentukan nilai tidak akan bisa dikompilasi
const name stringKompiler error
missing init expr for nameDeklarasi konstanta massal dapat menggunakan () untuk membungkus untuk meningkatkan keterbacaan dapat ada beberapa () mencapai efek pengelompokan.
const (
Count = 1
Name = "Jack"
)
const (
Size = 16
Len = 25
)Dalam kelompok konstanta yang sama konstanta setelah konstanta yang sudah diberikan nilai tidak perlu diberikan nilai nilainya secara default adalah nilai sebelumnya misalnya
const (
A = 1
B // 1
C // 1
D // 1
E // 1
)iota
iota adalah identifier konstanta built-in biasanya digunakan untuk表示 nomor urut integer tanpa tipe dalam deklarasi konstanta umumnya digunakan dalam tanda kurung.
const iota = 0Lihat beberapa kasus penggunaan
const (
Num = iota // 0
Num1 // 1
Num2 // 2
Num3 // 3
Num4 // 4
)Juga dapat menulis seperti ini
const (
Num = iota*2 // 0
Num1 // 2
Num2 // 4
Num3 // 6
Num4 // 8
)Juga dapat
const (
Num = iota << 2*3 + 1 // 1
Num1 // 13
Num2 // 25
Num3 = iota // 3
Num4 // 4
)Melalui beberapa contoh di atas dapat ditemukan iota adalah bertambah konstanta pertama menggunakan ekspresi nilai iota sesuai dengan perubahan nilai序号 akan secara otomatis diberikan ke konstanta berikutnya hingga direset dengan const baru序号 ini sebenarnya adalah nomor baris relatif kode adalah relatif terhadap baris awal kelompok saat ini lihat contoh di bawah ini
const (
Num = iota<<2*3 + 1 // 1 baris pertama
Num2 = iota<<2*3 + 1 // 13 baris kedua
_ // 25 baris ketiga
Num3 //37 baris keempat
Num4 = iota // 4 baris kelima
_ // 5 baris keenam
Num5 // 6 baris ketujuh
)Contoh ini menggunakan identifier anonim _ untuk menempati posisi satu baris dapat dilihat nilai iota pada dasarnya adalah selisih baris iota berada relatif terhadap baris pertama kelompok const saat ini. Sedangkan kelompok const yang berbeda tidak akan saling mempengaruhi.
Enumerasi
Bahasa Go tidak mendesain tipe data terpisah untuk enumerasi tidak seperti bahasa lain yang biasanya memiliki enum untuk表示. Umumnya di Go都是通过 tipe kustom + const + iota untuk mengimplementasikan enumerasi berikut adalah contoh sederhana
type Season uint8
const (
Spring Season = iota
Summer
Autumn
Winter
)Enumerasi ini sebenarnya adalah angka Go juga tidak mendukung mengonversinya langsung ke string tetapi kita dapat menambahkan metode pada tipe kustom untuk mengembalikan representasi stringnya mengimplementasikan antarmuka Stringer即可.
func (s Season) String() string {
switch s {
case Spring:
return "spring"
case Summer:
return "summer"
case Autumn:
return "autumn"
case Winter:
return "winter"
}
return ""
}Dengan begini adalah implementasi enumerasi sederhana. Anda juga dapat melalui alat resmi Stringer untuk secara otomatis menghasilkan enumerasi.
Tetapi ini memiliki kekurangan berikut
Tidak aman tipe karena
Seasonadalah tipe kustom dapat melalui konversi tipe paksa mengubah angka lain juga menjadi tipe inigoSeason(6)Rumit representasi string perlu diimplementasikan sendiri
Kemampuan ekspresi lemah karena
consthanya mendukung tipe data dasar jadi nilai enumerasi ini juga hanya dapat direpresentasikan menggunakan string dan angka
Mengapa tidak mendukung enumerasi pada tingkat bahasa adalah hal yang sangat tidak dapat dipahami oleh penulis saya认为 ini绝对 lebih banyak manfaat daripada kerugian.
