Skip to content

Variabel Go

Variabel adalah lokasi penyimpanan untuk menyimpan sebuah nilai memungkinkan nilai yang disimpan berubah secara dinamis saat runtime. Setiap mendeklarasikan variabel akan mengalokasikan sepotong memori untuk menyimpan nilai tipe yang sesuai pergi ke Referensi Manual-Variabel untuk melihat lebih banyak detail.

Deklarasi

Di Go deklarasi tipe adalah后置 deklarasi variabel akan menggunakan kata kunci var formatnya adalah var namaVariabel namaTipe aturan penamaan nama variabel harus mematuhi aturan penamaan identifier.

go
var intNum int
var str string
var char byte

Saat ingin mendeklarasikan beberapa variabel dengan tipe yang sama hanya perlu menulis tipe sekali

go
var numA, numB, numC int

Saat ingin mendeklarasikan beberapa variabel dengan tipe berbeda dapat menggunakan () untuk membungkus dapat ada beberapa ().

go
var (
  name    string
  age     int
  address string
)

var (
  school string
  class int
)

Sebuah variabel jika hanya dideklarasikan tanpa diberikan nilai maka nilai yang disimpan variabel adalah nilai nol dari tipe yang sesuai.

Penugasan

Penugasan akan menggunakan operator = misalnya

go
var name string
name = "jack"

Juga dapat langsung memberikan nilai saat mendeklarasikan

go
var name string = "jack"

Atau seperti ini juga dapat

go
var name string
var age int
name, age = "jack", 1

Cara kedua setiap kali harus menentukan tipe dapat menggunakan sugar sintaks yang disediakan resmi inisialisasi variabel pendek dapat menghilangkan kata kunci var dan tipe后置 apa tipenya diserahkan kepada kompiler untuk menyimpulkan secara otomatis.

go
name := "jack" // Variabel tipe string.

Meskipun dapat tidak menentukan tipe tetapi saat penugasan selanjutnya tipe harus tetap konsisten kode seperti di bawah ini tidak dapat dikompilasi.

a := 1
a = "1"

Perlu juga diperhatikan inisialisasi variabel pendek tidak dapat menggunakan nil karena nil tidak termasuk tipe apa pun kompiler tidak dapat menyimpulkan tipenya.

go
name := nil // Tidak dapat dikompilasi

Deklarasi variabel pendek dapat inisialisasi massal

go
name, age := "jack", 1

Cara deklarasi variabel pendek tidak dapat digunakan untuk variabel yang sudah ada misalnya

go
// Contoh salah
var a int
a := 1

// Contoh salah
a := 1
a := 2

Tetapi ada satu situasi kecuali yaitu saat memberikan nilai variabel lama sekaligus mendeklarasikan variabel baru misalnya

go
a := 1
a, b := 2, 2

Kode seperti ini dapat dikompilasi variabel a diberikan nilai kembali sedangkan b adalah variabel yang baru dideklarasikan.

Dalam bahasa Go ada satu aturan yaitu semua variabel dalam fungsi harus digunakan misalnya kode di bawah ini hanya mendeklarasikan variabel tetapi tidak menggunakannya

go
func main() {
  a := 1
}

Maka saat dikompilasi akan error memberitahu Anda variabel ini dideklarasikan tetapi tidak digunakan

a declared and not used

Aturan ini hanya berlaku untuk variabel dalam fungsi untuk variabel tingkat paket di luar fungsi tidak ada batasan ini kode di bawah ini dapat dikompilasi.

go
var a = 1

func main() {

}

Anonim

Menggunakan garis bawah dapat表示 tidak memerlukan suatu variabel

go
Open(name string) (*File, error)

Misalnya fungsi os.Open memiliki dua nilai pengembalian kita hanya ingin yang pertama tidak ingin yang kedua dapat menulis seperti di bawah ini

go
file, _ := os.Open("readme.txt")

Variabel yang tidak digunakan tidak dapat dikompilasi saat Anda tidak memerlukan suatu variabel dapat menggunakan garis bawah _ untuk menggantikan.

Pertukaran

Di Go jika ingin menukar nilai dua variabel tidak perlu menggunakan pointer dapat menggunakan operator penugasan langsung melakukan pertukaran secara sintaksis terlihat sangat intuitif contohnya sebagai berikut

go
num1, num2 := 25, 36
num1, num2 = num2, num1

Tiga variabel juga sama seperti ini

go
num1, num2, num3 := 25, 36, 49
num1, num2, num3  = num3, num2, num1

Pikirkan kode di bawah ini ini adalah sepotong kode untuk menghitung deret Fibonacci nilai tiga variabel setelah perhitungan masing-masing adalah berapa

go
a, b, c := 0, 1, 1
a, b, c = b, c, a+b

Jawabannya adalah

1 1 1

Anda mungkin bingung mengapa bukan

1 1 2

Jelas a sudah diberikan nilai b mengapa hasil a+b masih 1? Go saat melakukan operasi penugasan beberapa variabel urutannya adalah menghitung nilai terlebih dahulu lalu memberikan nilai bukan menghitung dari kiri ke kanan.

go
a, b, c = b, c, a+b

Anda mungkin mengira akan diuraikan menjadi kode di bawah ini

go
a = b
b = c
c = a + b

Tetapi sebenarnya akan menghitung nilai tiga angka a, b, c terlebih dahulu lalu memberikannya kepada mereka sama dengan kode di bawah ini

go
a, b, c = 1, 1, 0+1

Saat melibatkan pemanggilan fungsi efek ini lebih jelas kita memiliki fungsi sum dapat menghitung nilai pengembalian dua angka

go
func sum(a, b int) int {
  return a + b
}

Melalui fungsi untuk melakukan penjumlahan dua angka

go
a, b, c := 0, 1, 1
a, b, c = b, c, sum(a, b)

Hasil tidak berubah saat menghitung nilai pengembalian fungsi sum parameter masuknya tetap 0 dan 1

1 1 1

Jadi kode seharusnya ditulis terpisah seperti ini.

go
a, b = b, c
c = a + b

Perbandingan

Perbandingan antar variabel memiliki satu prasyarat yaitu tipe di antara mereka harus sama bahasa Go tidak ada konversi tipe implisit kode seperti di bawah ini tidak dapat dikompilasi

go
func main() {
  var a uint64
  var b int64
  fmt.Println(a == b)
}

Kompiler akan memberitahu Anda keduanya tipe tidak sama

invalid operation: a == b (mismatched types uint64 and int64)

Jadi harus menggunakan konversi tipe paksa

go
func main() {
  var a uint64
  var b int64
  fmt.Println(int64(a) == b)
}

Sebelum ada generik fungsi built-in min max yang disediakan Go awal hanya mendukung floating point hingga versi 1.21 Go baru saja menulis ulang kedua fungsi built-in ini dengan generik sekarang dapat menggunakan fungsi min untuk membandingkan nilai minimum

go
minVal := min(1, 2, -1, 1.2)

Menggunakan fungsi max untuk membandingkan nilai maksimum

go
maxVal := max(100, 22, -1, 1.12)

Parameter mereka mendukung semua tipe yang dapat dibandingkan tipe yang dapat dibandingkan di Go adalah

  • Boolean
  • Angka
  • String
  • Pointer
  • Channel (hanya mendukung判断 apakah sama)
  • Array yang elemennya adalah tipe yang dapat dibandingkan (slice tidak dapat dibandingkan) (hanya mendukung判断 apakah sama) (hanya mendukung perbandingan antar array dengan panjang yang sama karena panjang array juga merupakan bagian dari tipe dan tipe berbeda tidak dapat dibandingkan)
  • Struct yang field tipenya adalah tipe yang dapat dibandingkan (hanya mendukung判断 apakah sama)

Selain itu juga dapat melalui mengimpor pustaka standar cmp untuk判断 tetapi hanya mendukung parameter tipe terurut di Go tipe terurut built-in hanya angka dan string.

go
import "cmp"

func main() {
  cmp.Compare(1, 2)
  cmp.Less(1, 2)
}

Blok Kode

Di dalam fungsi dapat melalui kurung kurawal membuat blok kode ruang lingkup variabel antar blok kode saling independen. Misalnya kode di bawah ini

go
func main() {
  a := 1

  {
    a := 2
    fmt.Println(a)
  }

  {
    a := 3
    fmt.Println(a)
  }
  fmt.Println(a)
}

Outputnya adalah

2
3
1

Variabel antar blok saling independen tidak terganggu tidak dapat diakses tetapi akan dipengaruhi oleh blok induk.

go
func main() {
  a := 1

  {
    a := 2
    fmt.Println(a)
  }

  {
    fmt.Println(a)
  }
  fmt.Println(a)
}

Outputnya adalah

2
1
1

Golang by www.golangdev.cn edit