The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
YanSeven

go 结构体定义:匿名接口和具名接口

  •  
  •   YanSeven · Oct 15, 2025 · 2302 views
    This topic created in 258 days ago, the information mentioned may be changed or developed.
    定义一个结构体 A ,里面用到三个接口类型 i1,i2,i3 。
    那么这 3 个接口在 A 里面是作为一个具名的接口成员呢,还是匿名。

    这个该如何决策
    7 replies    2025-10-16 13:51:11 +08:00
    kfpenn
        1
    kfpenn  
       Oct 15, 2025
    如果是匿名的,可以把 A 当做实现了 i1,i2,i3 的实例直接当参数使用,如果没有这个需求,那就看你习惯,想命名还是匿名都可以
    zone10
        2
    zone10  
       Oct 15, 2025
    啊? 你的意思是把接口嵌入到结构体里? 我写了这么久 Go 第一次知道有这种写法, 试了一下好像还没毛病. 不过这是反模式不建议这么写, Go 是鸭子类型, A 实现 i1,i2,i3 的方法自动就实现了接口, 不需要嵌入到结构体
    gongym
        3
    gongym  
       Oct 15, 2025
    按照正常需求来说应该是匿名吧,A 就是 i1,i2,i3 接口的组合
    ycp
        4
    ycp  
       Oct 15, 2025
    | 如果你在… | 建议 |
    | -------------------- | ------------ |
    | 写业务逻辑或服务模块 | 用 **具名接口** |
    | 写一次性函数回调 | 可以用 **匿名接口** |
    | 想让结构体更容易测试、Mock 、依赖注入 | 必须用 **具名接口** |
    问了下 gpt 大多数情况用具名吧
    paceewang1
        5
    paceewang1  
       Oct 15, 2025   ❤️ 1
    1 、首先如果 A 是结构体的话,建议都是具名嵌入吧,不然接口里面有相同的方法还是要用具名的。
    2 、如果要表达的 A 是 i1,i2,i3 的并集,那么 A 应该也是一个接口而不是结构体。
    strobber16
        6
    strobber16  
       Oct 16, 2025 via Android
    go 的接口的命不命名不影响类型等于,除了担心污染命名空间,几乎没理由使用匿名接口
    neoblackcap
        7
    neoblackcap  
       Oct 16, 2025
    如果是想实现一个 i1 | i2 | i3 的并集接口类型,那么就要用匿名
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1121 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 18:19 · PVG 02:19 · LAX 11:19 · JFK 14:19
    ♥ Do have faith in what you're doing.