首頁 >後端開發 >Golang >分享golang的一個醜陋實現

分享golang的一個醜陋實現

藏色散人
藏色散人轉載
2021-04-09 11:55:262339瀏覽

下面由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實踐群中,有讚的兄弟(這位兄弟知道我提的上面的問題,並說這個是golang的實現方式)就問到了,在UnmarshalJSON的時候,為何Test字段沒有被賦值,並在golang中提了issue

他的程式碼如下:

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

這個問題的本質和我提出的那個問題一樣,因為op中嵌入了operation,所以有了UnmarshalJSON,符合了json包中Unmarshaler接口,所以內部用接口去處理的時候,op是滿足的,但實際處理的是operation,也就是以operation作為實體來進行UnmarshalJSON,導致了詭異的錯誤訊息。

我以為,這是golang實作中非常醜陋的地方。

依照耗子哥說的,如果語言實作規則是知道的,還是容易犯錯的,那就是一個坑。

這個golang的坑,估計以後還要填。

以上是分享golang的一個醜陋實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除