Skip to content

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

go
const name string = "Jack" // literal

const msg = "hello world" // literal

const num = 1 // literal

const numExpression = (1+2+3) / 2 % 100 + num // ekspresi konstanta

Jika hanya mendeklarasikan tanpa menentukan nilai tidak akan bisa dikompilasi

go
const name string

Kompiler error

missing init expr for name

Deklarasi konstanta massal dapat menggunakan () untuk membungkus untuk meningkatkan keterbacaan dapat ada beberapa () mencapai efek pengelompokan.

go
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

go
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.

go
const iota = 0

Lihat beberapa kasus penggunaan

go
const (
   Num = iota // 0
   Num1 // 1
   Num2 // 2
   Num3 // 3
   Num4 // 4
)

Juga dapat menulis seperti ini

go
const (
   Num = iota*2 // 0
   Num1 // 2
   Num2 // 4
   Num3 // 6
   Num4 // 8
)

Juga dapat

go
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

go
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

go
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即可.

go
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 Season adalah tipe kustom dapat melalui konversi tipe paksa mengubah angka lain juga menjadi tipe ini

    go
    Season(6)
  • Rumit representasi string perlu diimplementasikan sendiri

  • Kemampuan ekspresi lemah karena const hanya 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.

Golang by www.golangdev.cn edit