go 结构体内嵌接口的疑问 - V2EX
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yujianwjj

go 结构体内嵌接口的疑问

  •  
  •   yujianwjj Mar 19, 2021 2338 views
    This topic created in 1904 days ago, the information mentioned may be changed or developed.
    func TestInterface(t *testing.T) { type Reader interface { Read() } type Cache struct { Reader } c := Cache{} c.Read() } 

    以上代码会报空指针错误。

    我的疑问是,有没有办法在编译的时候就能够主动的发现这个错误。

    10 replies    2021-03-20 14:25:58 +08:00
    FinnBai
        1
    FinnBai  
       Mar 19, 2021
    结构体如果是实现接口,可以通过 var _ Reader = Cache{} 来发现。

    内嵌只能通过 if c.Reader != nil 来判断了吧,编译器并不知道你在哪里赋值了。
    hwdef
        2
    hwdef  
       Mar 19, 2021
    https://github.com/xxjwxc/uber_go_guide_cn

    可以看看 uber 的 go 风格指南,我记得有写
    Mark3K
        3
    Mark3K  
       Mar 19, 2021
    内嵌 interface 的目的是啥
    rrfeng
        4
    rrfeng  
       Mar 19, 2021
    你这个
    type Cache struct {
    Reader
    }
    等于
    type Cache struct {
    Reader Reader
    }

    然后 Cache{} 初始化时,接口类型默认值是 nil,所以 Reader 是 nil

    跟下面一个道理(指针类型的默认值是 nil )
    type Cache Struct {
    Something *int
    }


    所以,无解。通常写一个 NewCache() 方法生成可以避免。
    kele1997
        5
    kele1997  
       Mar 19, 2021
    `var _ Reader = (*Cache)(nil)`
    kele1997
        6
    kele1997  
       Mar 19, 2021
    不好意思,俺上面的写法是针对,实现接口的。你问题里面的是直接继承接口。
    不过你可以不继承接口,然后使用下面的代码来实现

    ```
    func TestInterface(t *testing.T) {
    type Reader interface {
    Read()
    }
    type Cache struct {
    }


    var _ Reader = (*Cache)(nil)
    c := Cache{}
    c.Read()
    }
    ```
    janxin
        7
    janxin  
       Mar 19, 2021
    @rrfeng 正解,不过即便写了 NewCache()也没法杜绝 SB 用户这么用♂
    nuk
        8
    nuk  
       Mar 19, 2021
    不能,所以不要把 interface 嵌入 struct
    fenghuang
        9
    fenghuang  
       Mar 19, 2021
    把 struct 匿名嵌套在 struct 也会出现这种情况
    asLw0P981N0M0TCC
        10
    asLw0P981N0M0TCC  
       Mar 20, 2021
    这个问题我怎么在哪见过啊
    About     Help     Advertise     Blog     API     FAQ     Solana     898 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 20:04 PVG 04:04 LAX 13:04 JFK 16:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86