我之前一直接触的都是面向对象的编程语言,突然到 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()
}
1
timpaik 2021-08-10 16:31:21 +08:00 via Android
写一个普通函数,返回一个结构体啊
|
2
wander639 2021-08-10 16:35:09 +08:00
func NewGameStart() *GameStart
|
3
lxz6597863 2021-08-10 16:37:57 +08:00
|
4
ChrisFreeMan OP |
5
ChrisFreeMan OP @lxz6597863 好吧,都是这种方式,感觉好难习惯
|
6
timpaik 2021-08-10 16:43:45 +08:00 via Android
直接赋值
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}, }, } 即可,其实不需要搞函数的 |
7
cheng6563 2021-08-10 16:47:09 +08:00
go 就不是面向对象的,他更像是个 c+,不要想差了
|
8
ChrisFreeMan OP @timpaik 正式的代码非常多,我是想尽量保持入口代码简洁,只要干净的调用对象,各个代码文件之间没有耦合,有些就是需要默认的类似于类初始化变量的一些值,可能是我编程习惯不一样吧。。。
|
9
ChrisFreeMan OP @cheng6563 好吧😂,突然发现脱离面向对象就不会写代码了
|
10
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() } ``` |
11
lesismal 2021-08-10 16:57:29 +08:00
pool 优化里也可以把那个 initedGameStart 去掉,*v = initedGameStart 就换成普通的赋值,或者放在 pool.Get 的 New 里,不需要每次都初始化这个 LayerPosition 字段,取决于实际需要
|
12
darknoll 2021-08-10 17:14:42 +08:00
不是所有语言都是面向对象,比如 go 和 js,适应就好
|
13
ChrisFreeMan OP @lesismal 我决定了,既然你们都这么说
|
14
ChrisFreeMan OP @darknoll 看来要给大脑升级一下了,话说我 Node 也写过了,es6 语法,一直都是当面向对象写的,也有类,也有 new
|
15
index90 2021-08-11 10:39:28 +08:00
好奇,你们所谓的“面向对象”语言如何优雅地初始化?有没有代码贴一下?
|