Pernyataan kondisional kompleks di golang

Saya baru-baru ini mulai belajar golang dan Revel. Saya mencoba memahami apa sebenarnya fungsi pernyataan if di bawah ini. Sepertinya ia sedang melakukan pemeriksaan tipe, tetapi saya tidak melihat apa yang dicapai oleh kondisi tersebut. Hargai jika ada yang bisa memberi tahu saya apa yang terjadi di sini. terima kasih

if str, ok := obj.(string); ok {
return len(str) > 0
}

person broun    schedule 08.06.2014    source sumber


Jawaban (2)


Ia mencoba mengubah obj (yang mungkin merupakan antarmuka abstrak) menjadi string, memeriksa apakah itu berhasil, dan hanya masuk jika ternyata baik-baik saja.

Ditulis lebih jarang dapat dilihat sebagai:

// do a type assertion/conversion of obj to a string. 
// If obj isn't really a string, ok will be false
str, ok := obj.(string) 

// this will only run if we're talking about a string
if ok {
 return len(str) > 0
}

Apa yang dilakukan go adalah transmisi aman dari beberapa antarmuka ke tipe sebenarnya. Jika Anda melakukan ini tanpa bagian ok, program Anda akan panik jika obj bukan sebuah string. yaitu kode ini akan membuat program Anda mogok jika obj bukan string:

str := obj.(string) 
return len(str) > 0   

Anda dapat membaca lebih lanjut tentang pernyataan tipe di dokumen:

http://golang.org/ref/spec#Type_assertions

person Not_a_Golfer    schedule 08.06.2014
comment
Ahh!! masuk akal, Terima kasih atas respons cepatnya. - person broun; 09.06.2014

Ini disebut pernyataan tipe. Variabel Anda obj adalah interface{}, dengan kata lain, tipe aslinya dapat berubah dari satu eksekusi ke eksekusi lainnya. Pernyataan tipe digunakan untuk menentukan tipe sebenarnya dari interface{}. Ada dua cara untuk melakukannya:

str = obj.(string)

Yang ini tidak aman: jika obj bukan string, program akan panik. Yang lainnya adalah yang Anda gunakan dalam kode Anda. Jika obj bukan string, boolean ok akan menjadi false.

Contohnya:

func f(v interface{}) {
    if _, ok := v.(string); ok {
        fmt.Println("v is a string!")
    } else if _, ok := v.(float64); ok {
        fmt.Println("v is a float64!")
    } else {
         fmt.Println("v is something else...")
    }
}
f(17.42) // "v is a float64!"
f("foobar") // "v is a string!"
f([]string{"hello", "world"}) // "v is something else..."
person julienc    schedule 08.06.2014
comment
[]interface{} harus diganti dengan interface{}. str dan if harus digunakan misalnya. fmt.Println(str) dan fmt.Println(if). - person Tom L; 24.04.2020