Maaf saya tidak bisa lebih spesifik dalam judul pertanyaan, tetapi saya membaca beberapa kode Go dan saya menemukan deklarasi fungsi dari formulir ini:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
dari https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
dari https://github.com/braintree/manners/blob/master/server.go
Apa arti dari (h handler)
dan (s *GracefulServer)
antara kurung? Apa arti seluruh pernyataan fungsi, dengan mempertimbangkan arti hal-hal antara tanda kurung?
Edit
Ini bukan duplikat Whats perbedaan fungsi dan metode di Go? : pertanyaan ini datang kepada saya karena saya tidak tahu apa hal-hal dalam tanda kurung sebelum nama fungsi, bukan karena saya bertanya-tanya apa perbedaan antara fungsi dan metode ... jika saya tahu bahwa deklarasi ini adalah metode saya tidak akan ' Saya tidak memiliki pertanyaan ini sejak awal. Jika seseorang memiliki keraguan yang sama dengan saya suatu hari, saya tidak percaya dia akan pergi mencari "metode golang" karena dia tidak tahu bahwa ini masalahnya. Ini akan seperti bertanya-tanya apa arti huruf "sigma" sebelum ekspresi matematika (tidak tahu itu berarti penjumlahan) dan seseorang mengatakan itu duplikat dari apa perbedaan antara penjumlahan dan beberapa hal lainnya.
Juga, jawaban singkat untuk pertanyaan ini ("itu penerima") bukanlah jawaban untuk "apa perbedaan antara fungsi dan metode".
n
elemen th dari daftar di Haskell? , yang ada di Pendahuluan tentang Pelajari Anda Haskell untuk Great Good dan jawab pertanyaan mereka tanpa keributan.Jawaban:
Ini disebut 'penerima'. Dalam kasus pertama
(h handler)
itu adalah tipe nilai, yang kedua(s *GracefulServer)
adalah pointer. Cara ini bekerja di Go mungkin sedikit berbeda dari beberapa bahasa lain. Namun tipe penerima, bekerja kurang lebih seperti kelas di sebagian besar pemrograman berorientasi objek. Ini adalah hal yang Anda panggil dari metode, seperti jika saya meletakkan beberapa metodeA
di samping beberapa kelasPerson
maka saya akan membutuhkan turunan tipePerson
untuk memanggilA
(anggap itu metode turunan dan bukan statis!).Salah satu yang perlu di sini adalah bahwa penerima akan didorong ke tumpukan panggilan seperti argumen lain jadi jika penerima adalah tipe nilai, seperti dalam kasus
handler
maka Anda akan bekerja pada salinan dari hal yang Anda panggil metode yang berarti sesuatu sepertih.Name = "Evan"
akan tidak bertahan setelah Anda kembali ke lingkup panggilan. Untuk alasan ini apa pun yang mengharapkan untuk mengubah keadaan penerima, perlu menggunakan pointer atau mengembalikan nilai yang dimodifikasi (memberikan lebih banyak paradigma tipe tidak berubah jika Anda mencari itu).Inilah bagian yang relevan dari spec; https://golang.org/ref/spec#Method_sets
sumber
Artinya
ServeHTTP
bukan fungsi yang berdiri sendiri. Tanda kurung sebelum nama fungsi adalah cara Go untuk mendefinisikan objek tempat fungsi-fungsi ini akan beroperasi. Jadi, pada dasarnyaServeHTTP
adalah metode type handler dan dapat dipanggil menggunakan objek apa pun, misalnya h, dari tipe handler.Mereka juga disebut penerima. Ada dua cara untuk mendefinisikannya. Jika Anda ingin memodifikasi penerima, gunakan pointer seperti:
Jika Anda tidak perlu memodifikasi penerima, Anda dapat mendefinisikan penerima sebagai nilai seperti:
Contoh ini dari taman bermain Go menunjukkan konsep.
Output dari program di atas adalah:
sumber