Teilen Sie eine hässliche Implementierung von Golang

藏色散人
Freigeben: 2021-04-09 19:25:24
nach vorne
2283 Leute haben es durchsucht

Die folgende Tutorial-Kolumne von golang wird Ihnen eine hässliche Implementierung von Golang vorstellen. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Teilen Sie eine hässliche Implementierung von Golang

Vor vielen Tagen habe ich in der golang-Übungsgruppe eine Frage zum folgenden Code gestellt: golang实践群里问了下面代码的问题:

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()
}
Nach dem Login kopieren

这个实现中,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)
}
Nach dem Login kopieren

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:

rrreee

Der 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.

Laut Bruder Maus ist es eine Falle, wenn die Regeln zur Sprachimplementierung bekannt sind, es aber dennoch leicht zu Fehlern kommt. 🎜🎜Diese Golang-Falle wird wahrscheinlich in Zukunft geschlossen werden müssen. 🎜🎜

Das obige ist der detaillierte Inhalt vonTeilen Sie eine hässliche Implementierung von Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage