各位大佬,有没有更好的给 Golang struct 初始化值的方式

2021-08-10 16:26:08 +08:00
 ChrisFreeMan

我之前一直接触的都是面向对象的编程语言,突然到 Golang 还有点不习惯,我这种方式 OK 不,我的想法是创建一个“类”的对象,但是 stuct 本身我没有找到初始化值的更好的方式

type GameStart struct{
  cloudNumber int
  gameStartLayers [8]*ebiten.Image
  layerPosition [8][2]float64
  menuList [3]*Menu
}

func (g *GameStart) Init(){
  g.cloudNumber = 3
  g.layerPosition  = [8][2]float64{
    {0, 0}, {0, 0}, {0, 230}, {0, 250},
    {0, 250}, {0, 0}, {0, 0}, {0, 0},
  }
}

func main(){
  var gameStart *GameStart = new(GameStart)
  gameStart.Init()
}
1710 次点击
所在节点    Go 编程语言
15 条回复
timpaik
2021-08-10 16:31:21 +08:00
写一个普通函数,返回一个结构体啊
wander639
2021-08-10 16:35:09 +08:00
func NewGameStart() *GameStart
lxz6597863
2021-08-10 16:37:57 +08:00
ChrisFreeMan
2021-08-10 16:38:00 +08:00
@timpaik
@wander639 好吧,似乎很多人都是这么做的,我就是想看看有没有更加面向对象编程的方式
ChrisFreeMan
2021-08-10 16:39:59 +08:00
@lxz6597863 好吧,都是这种方式,感觉好难习惯
timpaik
2021-08-10 16:43:45 +08:00
直接赋值
var gameStart = &GameStart{
cloudNumber: 3,
layerPosition: [8][2]float64{
{0, 0}, {0, 0}, {0, 230}, {0, 250},
{0, 250}, {0, 0}, {0, 0}, {0, 0},
},
}
即可,其实不需要搞函数的
cheng6563
2021-08-10 16:47:09 +08:00
go 就不是面向对象的,他更像是个 c+,不要想差了
ChrisFreeMan
2021-08-10 16:48:00 +08:00
@timpaik 正式的代码非常多,我是想尽量保持入口代码简洁,只要干净的调用对象,各个代码文件之间没有耦合,有些就是需要默认的类似于类初始化变量的一些值,可能是我编程习惯不一样吧。。。
ChrisFreeMan
2021-08-10 16:49:02 +08:00
@cheng6563 好吧😂,突然发现脱离面向对象就不会写代码了
lesismal
2021-08-10 16:55:30 +08:00
### 一般写法,工厂方法

```golang
package main

type GameStart struct {
cloudNumber int
gameStartLayers [8]*ebiten.Image
layerPosition [8][2]float64
menuList [3]*Menu
}

func NewGameStart() *GameStart {
return &GameStart{
cloudNumber: 3,
layerPosition: [8][2]float64{
{0, 0}, {0, 0}, {0, 230}, {0, 250},
{0, 250}, {0, 0}, {0, 0}, {0, 0},
},
}
}

func main() {
var gameStart = NewGameStart()
}
```


### 如果需要 pool 优化,还可以:
```golang
package main

import (
"sync"
)

var initedGameStart = GameStart{
cloudNumber: 3,
layerPosition: [8][2]float64{
{0, 0}, {0, 0}, {0, 230}, {0, 250},
{0, 250}, {0, 0}, {0, 0}, {0, 0},
},
}

var gameStartPool = sync.Pool{
New: func() interface{} {
return &GameStart{}
},
}

type GameStart struct {
cloudNumber int
gameStartLayers [8]*ebiten.Image
layerPosition [8][2]float64
menuList [3]*Menu
}

func (v *GameStart) Release() {
// maybe you want to release gameStartLayers and menuList here
// ...

gameStartPool.Put(v)
}

func NewGameStart() *GameStart {
v := gameStartPool.Get().(*GameStart)
*v = initedGameStart
return v
}

func main() {
var gameStart = NewGameStart()
defer gameStart.Release()
}
```
lesismal
2021-08-10 16:57:29 +08:00
pool 优化里也可以把那个 initedGameStart 去掉,*v = initedGameStart 就换成普通的赋值,或者放在 pool.Get 的 New 里,不需要每次都初始化这个 LayerPosition 字段,取决于实际需要
darknoll
2021-08-10 17:14:42 +08:00
不是所有语言都是面向对象,比如 go 和 js,适应就好
ChrisFreeMan
2021-08-10 17:47:58 +08:00
@lesismal 我决定了,既然你们都这么说
ChrisFreeMan
2021-08-10 17:48:52 +08:00
@darknoll 看来要给大脑升级一下了,话说我 Node 也写过了,es6 语法,一直都是当面向对象写的,也有类,也有 new
index90
2021-08-11 10:39:28 +08:00
好奇,你们所谓的“面向对象”语言如何优雅地初始化?有没有代码贴一下?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/794872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX