有如下的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}, 请问该如何实现?
楼主的问题,重点在于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了,很生疏。不知道是否解决你的疑问。不仅之处,见谅!
#5
更多评论
类似这样子实现,看能不能满足你要求:
```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)
}
```
#1
go不支持struct对象作为常量。
所以只能定义为变量:
```
var (
Zero = Vec{0, 0, 0}
)
```
或者通过一个包装函数获取:
```
func ZeroVec() Vec {
return Vec{0, 0, 0}
}
```
#2