Maison > développement back-end > Golang > le corps du texte

Partagez une implémentation moche de Golang

藏色散人
Libérer: 2021-04-09 19:25:24
avant
2293 Les gens l'ont consulté

Ce qui suit est une implémentation laide de golang de la colonne tutoriel golang J'espère que cela sera utile aux amis dans le besoin !

Partagez une implémentation moche de Golang

Il y a plusieurs jours, j'ai posé une question sur le code suivant dans 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()
}
Copier après la connexion

Dans cette implémentation, golang génère a. Cette implémentation viole l'implémentation habituelle de b en C++, Java et Python. Puisque les habitudes de pensée des langages ci-dessus ont été formées, alors cette implémentation. conduira à beaucoup de choses inattendues.

Hier, un frère qui l'a aimé dans golang实践群 (ce frère connaissait la question ci-dessus que j'ai posée et a dit qu'il s'agissait de l'implémentation de Golang) a demandé pourquoi quand UnmarshalJSON Le champ Test n'a reçu aucune valeur, et un problème a été soulevé dans golang

Son code est le suivant :

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)
}
Copier après la connexion

L'essence de ce problème est la même que celle que j'ai soulevée, car l'opération est intégrée dans l'op Donc avec. UnmarshalJSON, il est conforme à l'interface Unmarshaler dans le package json, donc lorsque l'interface est utilisée en interne pour le traitement, l'opération est satisfaite, mais ce qui est réellement traité est l'opération, c'est-à-dire que l'opération est utilisée comme entité pour effectuer UnmarshalJSON. , ce qui conduit à des messages d'erreur étranges.

Je pense que c'est un endroit très moche dans la mise en œuvre de Golang.

D'après ce que dit Brother Mouse, si les règles d'implémentation du langage sont connues, mais qu'il est quand même facile de faire des erreurs, alors c'est un piège.

Cet écueil du golang devra probablement être comblé à l'avenir.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal