Maison >développement back-end >Golang >Partagez une implémentation moche de Golang

Partagez une implémentation moche de Golang

藏色散人
藏色散人avant
2021-04-09 11:55:262322parcourir

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()
}

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)
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer