Saya baru mengenal antarmuka dan mencoba melakukan permintaan SOAP oleh github
Saya tidak mengerti artinya
Msg interface{}
dalam kode ini:
type Envelope struct {
Body `xml:"soap:"`
}
type Body struct {
Msg interface{}
}
Saya telah mengamati sintaks yang sama di
fmt.Println
tetapi tidak mengerti apa yang sedang dicapai
interface{}
interface{}
kurang lebih sama denganvoid *
di C. Itu bisa menunjuk ke apa pun dan Anda membutuhkan pernyataan cor / tipe untuk menggunakannya.Jawaban:
Anda dapat merujuk ke artikel " Cara menggunakan antarmuka di Go " (berdasarkan " deskripsi antarmuka Cox "):
(Itulah yang
Msg
diwakili dalam pertanyaan Anda: nilai apa pun)Tambahan: Ini adalah artikel Russ yang cukup lengkap mengenai struktur antarmuka:
sumber
interface{}
berarti Anda dapat memberi nilai pada jenis apa pun, termasuk jenis khusus Anda sendiri. Semua tipe di Go memenuhi antarmuka kosong (interface{}
adalah antarmuka kosong).Dalam contoh Anda, bidang Msg dapat memiliki nilai jenis apa pun.
Contoh:
Pergi Bermain
sumber
Ini disebut antarmuka kosong dan diimplementasikan oleh semua jenis, yang berarti Anda dapat meletakkan apa pun di
Msg
lapangan.Contoh:
Ini adalah ekstensi logis dari fakta bahwa suatu jenis mengimplementasikan antarmuka segera setelah ia memiliki semua metode antarmuka.
sumber
Sudah ada jawaban bagus di sini. Izinkan saya menambahkan milik saya juga untuk orang lain yang ingin memahaminya secara intuitif:
Antarmuka
Berikut ini antarmuka dengan satu metode:
Jadi tipe apa pun yang memiliki
Run()
metode memenuhi antarmuka Runner:Meskipun tipe Program juga memiliki metode Stop, masih memenuhi antarmuka Runner karena semua yang diperlukan adalah memiliki semua metode antarmuka untuk memuaskannya.
Jadi, ia memiliki metode Jalankan dan memenuhi antarmuka Runner.
Antarmuka Kosong
Inilah antarmuka kosong bernama tanpa metode apa pun:
Jadi jenis apa pun memenuhi antarmuka ini. Karena, tidak diperlukan metode untuk memuaskan antarmuka ini. Sebagai contoh:
Tetapi, apakah tipe Program di atas memuaskan? Iya:
antarmuka {} sama dengan antarmuka Kosong di atas.
Seperti yang Anda lihat, tidak ada yang misterius tentang itu tetapi sangat mudah disalahgunakan. Jauhi itu sebanyak yang Anda bisa.
https://play.golang.org/p/A-vwTddWJ7G
sumber
type Runner interface
tidak digunakan dalam contoh taman bermain Go.Dari Spesifikasi Golang :
Konsep yang harus dihadapi adalah:
T
memiliki 3 metode:A
,B
,C
.T_interface = (A, B, C)
MyInterface = (A, )
MyInterface
dalamnya harus terkandung di dalamnyaT_interface
Anda dapat menyimpulkan bahwa semua "tipe antarmuka" dari semua jenis adalah superset dari antarmuka kosong.
sumber
Contoh yang memperluas jawaban yang sangat baik oleh @VonC dan komentar oleh @ NickCraig-Wood.
interface{}
dapat menunjuk ke apa saja dan Anda memerlukan pernyataan cor / type untuk menggunakannya.i
adalah variabel antarmuka kosong dengan nilaicat("Fish")
. Adalah sah untuk membuat nilai metode dari nilai tipe antarmuka. Lihat https://golang.org/ref/spec#Interface_types .Saklar tipe mengkonfirmasi
i
tipe antarmukacat("Fish")
. Lihat https://golang.org/doc/effective_go.html#type_switch .i
kemudian dipindahkan kedog("Bone")
. Switch tipe mengkonfirmasi bahwai
tipe antarmuka telah berubah menjadidog("Bone")
.Anda juga dapat meminta compiler untuk memeriksa bahwa jenis
T
mengimplementasikan antarmukaI
dengan mencoba tugas:var _ I = T{}
. Lihat https://golang.org/doc/faq#guarantee_satisfies_interface dan https://stackoverflow.com/a/60663003/12817546 .Semua tipe mengimplementasikan antarmuka kosong
interface{}
. Lihat https://talks.golang.org/2012/goforc.slide#44 dan https://golang.org/ref/spec#Interface_types . Dalam contoh ini,i
dipindahkan, kali ini ke string "4.3".i
kemudian ditugaskan ke variabel string barus
dengani.(string)
sebelums
dikonversi ke tipe float64f
menggunakanstrconv
. Akhirnyaf
dikonversi ken
tipe int sama dengan 4. Lihat Apa perbedaan antara konversi tipe dan penegasan tipe?Peta dan irisan bawaan Go, ditambah kemampuan untuk menggunakan antarmuka kosong untuk membuat wadah (dengan unboxing eksplisit) berarti dalam banyak kasus, dimungkinkan untuk menulis kode yang melakukan apa yang dimungkinkan oleh obat generik, jika kurang lancar. Lihat https://golang.org/doc/faq#generics .
sumber