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

Golang 中结构体常量的三种实现方式

  •  
  •   index90 · 2019-06-26 15:05:29 +08:00 · 10139 次点击
    这是一个创建于 2005 天前的主题,其中的信息可能已经有所发展或是发生改变。
    type User interface {
      Name() string
    }
    
    type a struct {}
    func (a *a) Name() string {
      return "xiaoming"
    }
    
    type b struct {
      name string
    }
    
    func (b *b) Name() string {
      return b.name
    }
    
    type c struct {
      Name string
    }
    
    var ConstA = a{}
    var ConstB = b{ name: "xiaoming" }
    var ConstC = c{ Name: "xiaoming" }
    

    这三种方式你会选哪种? 我怎么觉得 A 比较好? 或者有其他实现方式,欢迎讨论。

    14 条回复    2019-07-12 16:14:27 +08:00
    Muninn
        1
    Muninn  
       2019-06-26 15:43:21 +08:00
    golang 一般不兴给结构体搞常量
    都是用 const 写最前边的
    liulaomo
        2
    liulaomo  
       2019-06-26 15:49:02 +08:00
    ConstC.Name 可以更改吧。

    ConstA 和 ConstB 可以被整体修改。

    其实可以写一个函数返回一个副本:

    type b struct {
    name string
    }

    func (b *b) Name() string {
    return b.name
    }

    func ConstB() b {
    return b{ name: "xiaoming" }
    }

    缺少不变量支持确实是 Go 的一大痛点,但是很遗憾,目前此问题并未被核心团队认为是最紧迫的问题。
    szy007
        3
    szy007  
       2019-06-26 15:52:48 +08:00
    表示同意一楼的说法
    GuangXiN
        4
    GuangXiN  
       2019-06-26 16:28:46 +08:00
    const (
    a719114136
        5
    a719114136  
       2019-06-26 16:38:01 +08:00 via Android
    看实际情况,我两种都有用
    brucewuio
        6
    brucewuio  
       2019-06-26 17:42:39 +08:00
    神经病
    index90
        7
    index90  
    OP
       2019-06-26 17:56:00 +08:00
    @brucewuio 麻烦不要骂人
    useben
        8
    useben  
       2019-06-26 17:56:15 +08:00
    const (

    )
    index90
        9
    index90  
    OP
       2019-06-26 17:58:14 +08:00
    @useben const 只能定义基础类型常量
    Mohanson
        10
    Mohanson  
       2019-06-27 02:36:27 +08:00 via Android
    可你定义出来的不是常量而是变量,问号???
    scofieldpeng
        11
    scofieldpeng  
       2019-06-27 10:16:48 +08:00
    看到定义常量标题第一反应不是 const ?看来楼主的代码明白了你的意思,按照 2 楼的来吧,var 这种虽然能用,但是。。。如果你的队友不靠谱的时候。。。
    index90
        12
    index90  
    OP
       2019-06-27 10:45:25 +08:00
    @scofieldpeng 没办法哦,Go 不能定义常量的 struct,但是如果有定义常量 struct 的需求,我看到的其他库的源码基本上都是这样实现。可能我这里不应该说常量?
    Muninn
        13
    Muninn  
       2019-06-27 22:26:10 +08:00
    你的 abc 看起来像是要在 struct 里边定义个常量字段。

    如果想要一个 struct 当做常量,用一个函数 return 固定的 struct 就好了啊……
    reus
        14
    reus  
       2019-07-12 16:14:27 +08:00
    const (
    User = "abc"
    )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2752 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:32 · PVG 20:32 · LAX 04:32 · JFK 07:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.