Pertanyaan Argumen dalam panggilan RPC golang


Dalam fungsi handler RPC, saya menghilangkan argumen pertama seperti:

func (self Handler) GetName(int, reply *StructObj) {
}

dan di sisi panggilan

var reply StructObj
client.Call("Handler.GetName", 0, &reply)

Karena saya tidak membutuhkan argumen pertama dalam Metode GetName, saya menghilangkan namanya, NAMUN, saya mendapatkan:

gob: type mismatch in decoder: want struct type

Saya mengubah metode GetName ke GetName (id int, balas * StructObj) dan berhasil. Saya ingin tahu mengapa ini terjadi?


4
2017-09-16 05:41


asal


Jawaban:


Anda menekan aspek rumit sintaks definisi fungsi di Go. Anda tidak dapat memiliki argumen yang tidak disebutkan namanya, dan Anda bisa sebut argumen int, dan func f(x, y, z Type) adalah pintas untuk menyatakan ketiga variabel menjadi tipe Type. Sebagai contoh, func f(int, x string) counterintuitively menyatakan suatu f yang menerima dua string, salah satunya kebetulan diberi nama int.

package main

import "fmt"

func f(int, x string) {
    fmt.Println("int is:", int)
    fmt.Println("x is:", x)
}

func main() {
    f("foo", "bar")
}

Ketika Anda menjalankannya, hasilnya adalah

int is: foo
x is: bar

Ya, itu sedikit melekuk pikiran. Saya belum pernah mendengar pemikiran spesifik menjelaskan, tetapi mungkin mereka terus membangun nama-nama jenis yang tidak dipesan sehingga mereka nantinya dapat memperkenalkan jenis bawaan baru tanpa melanggar kode yang sudah ada di luar sana.

Bagaimanapun, itu berarti definisi fungsi pertama Anda tidak benar-benar menerima int dan a *StructObj tapi Sebuah *StructObj bernama int dan nama lainnya reply. Jadi pesan kesalahan dari net/rpc sebenarnya berarti bahwa klien melewati 0 ketika diharapkan a *StructObj. Cukup menyenangkan.


6
2017-09-16 06:10