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

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

  •  
  •   ChrisFreeMan · 2021-08-10 16:26:08 +08:00 · 1706 次点击
    这是一个创建于 1200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我之前一直接触的都是面向对象的编程语言,突然到 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()
    }
    
    15 条回复    2021-08-11 10:39:28 +08:00
    timpaik
        1
    timpaik  
       2021-08-10 16:31:21 +08:00 via Android
    写一个普通函数,返回一个结构体啊
    wander639
        2
    wander639  
       2021-08-10 16:35:09 +08:00
    func NewGameStart() *GameStart
    ChrisFreeMan
        4
    ChrisFreeMan  
    OP
       2021-08-10 16:38:00 +08:00
    @timpaik
    @wander639 好吧,似乎很多人都是这么做的,我就是想看看有没有更加面向对象编程的方式
    ChrisFreeMan
        5
    ChrisFreeMan  
    OP
       2021-08-10 16:39:59 +08:00
    @lxz6597863 好吧,都是这种方式,感觉好难习惯
    timpaik
        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},
    },
    }
    即可,其实不需要搞函数的
    cheng6563
        7
    cheng6563  
       2021-08-10 16:47:09 +08:00
    go 就不是面向对象的,他更像是个 c+,不要想差了
    ChrisFreeMan
        8
    ChrisFreeMan  
    OP
       2021-08-10 16:48:00 +08:00
    @timpaik 正式的代码非常多,我是想尽量保持入口代码简洁,只要干净的调用对象,各个代码文件之间没有耦合,有些就是需要默认的类似于类初始化变量的一些值,可能是我编程习惯不一样吧。。。
    ChrisFreeMan
        9
    ChrisFreeMan  
    OP
       2021-08-10 16:49:02 +08:00
    @cheng6563 好吧😂,突然发现脱离面向对象就不会写代码了
    lesismal
        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()
    }
    ```
    lesismal
        11
    lesismal  
       2021-08-10 16:57:29 +08:00
    pool 优化里也可以把那个 initedGameStart 去掉,*v = initedGameStart 就换成普通的赋值,或者放在 pool.Get 的 New 里,不需要每次都初始化这个 LayerPosition 字段,取决于实际需要
    darknoll
        12
    darknoll  
       2021-08-10 17:14:42 +08:00
    不是所有语言都是面向对象,比如 go 和 js,适应就好
    ChrisFreeMan
        13
    ChrisFreeMan  
    OP
       2021-08-10 17:47:58 +08:00
    @lesismal 我决定了,既然你们都这么说
    ChrisFreeMan
        14
    ChrisFreeMan  
    OP
       2021-08-10 17:48:52 +08:00
    @darknoll 看来要给大脑升级一下了,话说我 Node 也写过了,es6 语法,一直都是当面向对象写的,也有类,也有 new
    index90
        15
    index90  
       2021-08-11 10:39:28 +08:00
    好奇,你们所谓的“面向对象”语言如何优雅地初始化?有没有代码贴一下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1237 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:02 · PVG 02:02 · LAX 10:02 · JFK 13:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.