如何在Struct中定义常量

cstyle · 2016-10-27 02:21:19 · 6637 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2016-10-27 02:21:19 的主题,其中的信息可能已经有所发展或是发生改变。

有如下的Java代码

class Vec
{
    public final double x, y, z;    // position, also color (r,g,b)
    public static final Vec Zero = new Vec(0, 0, 0);
}

我使用GO的struct模拟上面的代码

type Vec struct {
    x, y, z float64
    Zero Vec = &Vec{0, 0, 0}    //这样的实现不支持,该如何实现
}

但GO好像不支持在struct中编写这样的语句 Zero Vec = &Vec{0, 0, 0}, 请问该如何实现?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6637 次点击  
加入收藏 微博
6 回复  |  直到 2016-10-30 03:12:57
polaris
polaris · #1 · 8年之前

类似这样子实现,看能不能满足你要求:

package main

import "fmt"

type Vec struct {
    x, y, z float64
    Zero    *Vec
}

func NewVec(x, y, z float64) *Vec {
    return &Vec{
        x:    x,
        y:    y,
        z:    z,
        Zero: &Vec{x: 0, y: 0, z: 0},
    }
}

func main() {
    v := NewVec(10, 2, 30)
    fmt.Println(v)
}
stevewang
stevewang · #2 · 8年之前

go不支持struct对象作为常量。 所以只能定义为变量:

var (
    Zero = Vec{0, 0, 0}
)

或者通过一个包装函数获取:

func ZeroVec() Vec {
    return Vec{0, 0, 0}
}
cstyle
cstyle · #3 · 8年之前
polarispolaris #1 回复

类似这样子实现,看能不能满足你要求: ```go package main import "fmt" type Vec struct { x, y, z float64 Zero *Vec } func NewVec(x, y, z float64) *Vec { return &Vec{ x: x, y: y, z: z, Zero: &Vec{x: 0, y: 0, z: 0}, } } func main() { v := NewVec(10, 2, 30) fmt.Println(v) } ```

谢谢,我试下

cstyle
cstyle · #4 · 8年之前
stevewangstevewang #2 回复

go不支持struct对象作为常量。 所以只能定义为变量: ``` var ( Zero = Vec{0, 0, 0} ) ``` 或者通过一个包装函数获取: ``` func ZeroVec() Vec { return Vec{0, 0, 0} } ```

谢谢,我试下

alex_023
alex_023 · #5 · 8年之前

楼主的问题,重点在于java的static。尽管该变量是定义在Vect,但实际上是全局唯一副本。因此,从应用上,需要判定是用于判定zero相等,还是为了定义这么个全局副本。所以有两种方式:

  1. 如果是强调唯一副本,则很方便,就直接定义一个ZeroVec的变量即可,不用嵌入在Vec的struct中。只需要在外边用var一个变量即可,全局一个副本。代码easy:
    var Zero = &Vec{x: 0, y: 0, z: 0}
    
    2.如果是运行时判断为0值,则没必要定义一个变量。参照标准库time.IsZero。代码如下:
    type Vec struct {
     x, y, z float64
    }
    func (c *Vec) IsZero() {
     return c.x == 0 && c.y == 0 && c.z == 0 //java中,也需要实现对应的判等方法,否则就是判断地址是否一致。
    }
    
    很久没搞java了,很生疏。不知道是否解决你的疑问。不仅之处,见谅!
cstyle
cstyle · #6 · 8年之前
alex_023alex_023 #5 回复

楼主的问题,重点在于java的static。尽管该变量是定义在Vect,但实际上是全局唯一副本。因此,从应用上,需要判定是用于判定zero相等,还是为了定义这么个全局副本。所以有两种方式: 1. 如果是强调唯一副本,则很方便,就直接定义一个ZeroVec的变量即可,不用嵌入在Vec的struct中。只需要在外边用var一个变量即可,全局**一个副本**。代码easy: ```Go var Zero = &Vec{x: 0, y: 0, z: 0} ``` 2.如果是运行时判断为0值,则没必要定义一个变量。参照标准库time.IsZero。代码如下: ```Go type Vec struct { x, y, z float64 } func (c *Vec) IsZero() { return c.x == 0 && c.y == 0 && c.z == 0 //java中,也需要实现对应的判等方法,否则就是判断地址是否一致。 } ``` 很久没搞java了,很生疏。不知道是否解决你的疑问。不仅之处,见谅!

已经采用了第一种方法,谢谢你的帮助

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传