分享golang的一个丑陋实现


本文摘自php中文网,作者藏色散人,侵删。

下面由golang教程栏目给大家分享golang的一个丑陋实现 ,希望对需要的朋友有所帮助!

好多些天前,我在golang实践群里问了下面代码的问题:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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

他的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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的一个丑陋实现的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang中关于文件的操作

go-carbon 1.3.1 版本发布,新增 diffforhumans() 方法和多语言支持

golang项目如何部署到linux服务器

golang channel是什么

golang反射重要吗

性能优化+架构迭代升级 go读书社区web开发与架构优化

golang 是面向对象的么

go context机制

golang可以写网站吗

go关于tpl文件无法读取域中数据{{$.name}}

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...