V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
SGL
V2EX  ›  Go 编程语言

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

  •  
  •   SGL · 7 天前 · 1254 次点击
    定义一个结构体 A ,里面用到三个接口类型 i1,i2,i3 。
    那么这 3 个接口在 A 里面是作为一个具名的接口成员呢,还是匿名。

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