Apa itu “_,” (garis bawah koma) dalam deklarasi Go?

100

Dan sepertinya saya tidak dapat memahami jenis deklarasi variabel ini:

_, prs := m["example"]

Apa sebenarnya yang _,dilakukan dan mengapa mereka mendeklarasikan variabel seperti ini, bukan

prs := m["example"]

(Saya menemukannya sebagai bagian dari Go by Example: Maps )

Kansuler
sumber
3
Untuk pertanyaan bahasa di masa mendatang, lihat spesifikasinya terlebih dahulu. Itu harus menjawab semua pertanyaan Anda.
fuz
Sebagai komentar: prsmungkin singkatan dari "sekarang". Kode dalam contoh Anda memeriksa ada atau tidaknya entri "example"di mpeta.
dyoo
6
@FUZxxl Ya, saya pernah melihatnya di sana sebelumnya, tetapi karena saya tidak tahu nama fiturnya, saya tidak menemukannya. Saya juga menemukan spesifikasi resmi untuk bahasa pemrograman tidak terlalu pedagogis dan lebih baik dipelajari dengan contoh.
Kansuler
@dyoo Setelah saya mendapatkan penjelasan di bawah ini saya menemukan artinya, tetapi perlu dicatat jika orang lain memiliki pertanyaan yang sama!
Kansuler
8
@FUZxxl: Saya tidak tahu. Sebagian besar pertanyaan yang diajukan di SO mungkin memiliki jawaban yang tersedia di suatu tempat. Ada beberapa ambang batas, di bawahnya pertanyaan mungkin tidak boleh ditanyakan, tetapi menurut saya pertanyaan ini tidak berada di bawahnya.
thb

Jawaban:

121

Ini menghindari keharusan mendeklarasikan semua variabel untuk nilai kembali.
Ini disebut pengenal kosong .

Seperti dalam:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

(yang 'lain _' kasus yang digunakan adalah untuk impor )

Karena membuang nilai yang dikembalikan, akan sangat membantu jika Anda ingin memeriksa hanya satu dari nilai yang dikembalikan, seperti dalam " Bagaimana cara menguji keberadaan kunci di peta? " Yang ditampilkan dalam " Efektif Mulai, peta ":

_, present := timeZone[tz]

Untuk menguji keberadaan di peta tanpa mengkhawatirkan nilai sebenarnya, Anda bisa menggunakan pengenal kosong, garis bawah sederhana ( _).
Pengenal kosong dapat ditetapkan atau dideklarasikan dengan nilai jenis apa pun, dengan nilai yang dibuang tanpa membahayakan.
Untuk menguji keberadaan di peta, gunakan pengenal kosong sebagai pengganti variabel biasa untuk nilainya.

Seperti yang ditambahkan Jsor di komentar :

"standar yang diterima secara umum" adalah memanggil variabel uji keanggotaan "ok" (sama untuk memeriksa apakah saluran yang dibaca valid atau tidak)

Itu memungkinkan Anda untuk menggabungkannya dengan tes:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

Anda juga akan menemukannya dalam loop:

Jika Anda hanya membutuhkan item kedua dalam rentang (nilai), gunakan pengenal kosong, garis bawah, untuk membuang yang pertama:

sum := 0
for _, value := range array {
    sum += value
}
VonC
sumber
Terima kasih telah memberikan contoh yang baik. Aku butuh beberapa pemikiran untuk memahami konsepnya, tapi sekarang aku mengerti!
Kansuler
Perhatikan bahwa IME "standar yang diterima secara umum" adalah memanggil variabel uji keanggotaan "ok" (sama untuk memeriksa apakah pembacaan saluran valid atau tidak).
LinearZoetrope
1
@Jsor saya setuju. Saya telah memasukkan komentar Anda dalam jawaban agar lebih terlihat, dan menambahkan beberapa contoh tambahan.
VonC
64

Kompilator Go tidak mengizinkan Anda membuat variabel yang tidak pernah Anda gunakan.

for i, value := range x {
   total += value
}

Kode di atas akan mengembalikan pesan kesalahan "saya dideklarasikan dan tidak digunakan".

Karena kami tidak menggunakan i di dalam loop kami, kami perlu mengubahnya menjadi ini:

for _, value := range x {
   total += value
}
Juni Brosas
sumber
13
Kalimat pertama Anda penting untuk memahami alasan mengapa ada _ sebagai pengenal kosong.
Tarik
4

_adalah pengenal kosong. Artinya nilai yang harus diberikan akan dibuang.

Ini dia nilai examplekunci yang dibuang. Baris kode kedua akan membuang kehadiran boolean dan menyimpan nilainya di prs.
Jadi untuk hanya memeriksa keberadaan di peta, Anda dapat membuang nilainya. Ini dapat digunakan untuk menggunakan peta sebagai satu set.

ThinkChaos
sumber
3

Pengenal kosong dapat digunakan setiap kali sintaks memerlukan nama variabel tetapi logika program tidak, misalnya untuk membuang indeks loop yang tidak diinginkan ketika kita hanya membutuhkan nilai elemen.

Kutipan Dari:

Bahasa Pemrograman Go (Seri Komputasi Profesional Addison-Wesley)

Brian W. Kernighan

Materi ini mungkin dilindungi oleh hak cipta.

koopertrooper
sumber
2

Ini disebut pengenal kosong dan ini membantu dalam kasus di mana Anda ingin membuang nilai yang akan dikembalikan dan tidak mereferensikannya

Beberapa tempat kami menggunakannya:

  • Sebuah fungsi mengembalikan nilai dan Anda tidak bermaksud menggunakannya di masa mendatang
  • Anda ingin mengulang dan membutuhkan nilai i yang tidak akan Anda gunakan
Anagha
sumber
1

Pada dasarnya _,dikenal sebagai pengenal kosong. Di GO kita tidak bisa memiliki variabel yang tidak digunakan.

Sebagai contoh ketika Anda melakukan iterasi melalui array jika Anda menggunakan nilai: = range Anda tidak ingin nilai i untuk iterasi. Tetapi jika Anda menghilangkan nilai i, itu akan mengembalikan kesalahan. Tetapi jika Anda menyatakan i dan tidak menggunakannya, itu juga akan mengembalikan kesalahan.

Oleh karena itu, tempat itulah yang harus kita gunakan _,.

Juga digunakan saat Anda tidak menginginkan nilai kembalian fungsi di masa mendatang.

Kaveen Hyacinth
sumber
1

Kasus penggunaan yang bagus untuk variabel yang tidak digunakan adalah situasi ketika Anda hanya membutuhkan keluaran parsial. Pada contoh di bawah ini kita hanya perlu mencetak nilai (populasi negara bagian).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}
monkrus
sumber
0

Variabel yang tidak digunakan tidak diperbolehkan di Golang

Jika Anda berasal dari bahasa pemrograman lain, ini mungkin terasa agak sulit untuk terbiasa dengan ini. Tetapi ini menghasilkan kode yang lebih bersih. Jadi dengan menggunakan a _kami mengatakan kami tahu ada variabel di sana tetapi kami tidak ingin menggunakannya dan memberi tahu kompiler yang tidak mengeluh kepada saya tentang itu. :)

Krishnadas PC
sumber