>백엔드 개발 >Golang >추악한 golang 구현 공유

추악한 golang 구현 공유

藏色散人
藏色散人앞으로
2021-04-09 11:55:262322검색

다음 golang 튜토리얼 칼럼에서는 Golang의 추악한 구현을 공유할 예정입니다. 도움이 필요한 친구들에게 도움이 되기를 바랍니다!

추악한 golang 구현 공유

몇일 전 golang 연습 그룹에서 다음 코드에 대해 질문했습니다. 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()
}

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

이 구현에서 golang은 a를 출력합니다. 이 구현은 C++, Java 및 Python에서 일반적인 b 구현을 위반합니다. 위 언어의 사고 습관이 형성되었으므로 이 구현은 많은 혼란을 야기합니다. . 예상치 못한 일들.

어제 golang 연습 그룹에서 좋아했던 형제(이 형제는 내가 물어본 위의 질문을 알고 이것이 golang의 구현이라고 말했습니다)가 UnmarshalJSON에 대해 물었습니다. 테스트 필드에 값이 할당되지 않고 golang에서 문제가 발생한 이유

그의 코드는 다음과 같습니다.

rrreee

이 문제의 본질은 제가 제기한 것과 동일합니다. 연산이 op에 포함되어 있기 때문입니다. 그래서 UnmarshalJSON이 있는데, json 패키지의 Unmarshaler 인터페이스를 따르기 때문에 인터페이스를 내부적으로 처리하는데 사용할 때는 op는 만족하지만 실제로 처리되는 것은 오퍼레이션, 즉 오퍼레이션을 엔터티로 사용하는 것이다. UnmarshalJSON을 수행하면 이상한 오류 메시지가 나타납니다.

이곳은 golang 구현에 있어 매우 보기 흉한 곳이라고 생각합니다.

Brother Mouse에 따르면 언어 구현 규칙을 알고 있지만 여전히 실수하기 쉽다면 함정이라고 합니다. 🎜🎜이 Golang 함정은 아마도 미래에 채워져야 할 것입니다. 🎜🎜

위 내용은 추악한 golang 구현 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제