package main import "fmt" type Aer interface{ Name()string PrintName() } type A struct { } func (a *A) Name() string { return "a" } func (a *A) PrintName() { fmt.Println(a.Name()) } type B struct { A } func (b *B) Name() string { return "b" } func getAer() Aer { return &B{} } func main() { a := getAer() a.printName() }
这个实现中,golang输出的是a,这个实现违反了通常C++,Java,Python中会输出b的实现,由于上述几个语言的思维习惯已经形成,那么这个实现就会导致很多意想不到的事情。
昨儿个在golang实践群
package main import ( "encoding/json" "fmt" ) type request struct { Operations map[string]op `json:"operations"` } type op struct { operation Test string `json:"test"` } type operation struct { Width int `json:"width"` Height int `json:"height"` } func (o *operation) UnmarshalJSON(b []byte) error { type xoperation operation xo := &xoperation{Width: 500, Height: 500} if err := json.Unmarshal(b, xo); err != nil { return err } *o = operation(*xo) return nil } func main() { jsonStr := `{ "operations": { "001": { "test":"test", "width": 100 } } }` req := request{} json.Unmarshal([]byte(jsonStr), &req) fmt.Println(req) }
In dieser Implementierung gibt Golang a aus. Diese Implementierung verstößt gegen die übliche Implementierung von b in C++, Java und Python. Da die Denkgewohnheiten der oben genannten Sprachen gebildet wurden, wird diese Implementierung viel Verwirrung stiften . Unerwartete Dinge.
Gestern fragte ein Bruder, dem es in der Golang-Übungsgruppe
gefiel (dieser Bruder kannte die oben gestellte Frage und sagte, dass dies die Implementierung von Golang sei), danach. warum dem Testfeld kein Wert zugewiesen wurde und ein Problem in Golang ausgelöst wurde
Sein Code lautet wie folgt:
rrreeeDer Kern dieses Problems ist derselbe wie der, den ich angesprochen habe, da die Operation in die Operation eingebettet ist. Es gibt also UnmarshalJSON. Es entspricht der Unmarshaler-Schnittstelle im JSON-Paket. Wenn die Schnittstelle also intern zur Verarbeitung verwendet wird, ist die Operation erfüllt, aber was tatsächlich verarbeitet wird, ist die Operation, das heißt, die Operation wird als Entität verwendet um UnmarshalJSON auszuführen, was zu seltsamen Fehlermeldungen führt.
Ich denke, das ist eine sehr hässliche Stelle bei der Golang-Implementierung.