• 技术文章 >后端开发 >Golang

    分享golang的一个丑陋实现

    藏色散人藏色散人2021-04-09 19:25:24转载135
    下面由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,如有侵犯,请联系a@php.cn删除
    专题推荐:golang
    上一篇:详解 golang 依赖管理之 mod 下一篇:分享一个go语言采坑:闭包共享变量问题
    第15期线上培训班

    相关文章推荐

    • golang中线程和协程的区别是什么• 详解Json序列化在golang中的应用• golang中判断两个slice是否相等• golang环境怎么安装• 详解 golang 依赖管理之 mod

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网