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

发布于 1周前 作者 caililin 来自 Go语言

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

我之前一直接触的都是面向对象的编程语言,突然到 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()
}

更多关于Golang Go语言中 各位大佬,有没有更好的给 struct 初始化值的方式的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

16 回复

写一个普通函数,返回一个结构体啊

更多关于Golang Go语言中 各位大佬,有没有更好的给 struct 初始化值的方式的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


func NewGameStart() *GameStart


好吧,似乎很多人都是这么做的,我就是想看看有没有更加面向对象编程的方式

好吧,都是这种方式,感觉好难习惯

直接赋值
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},
},
}
即可,其实不需要搞函数的

go 就不是面向对象的,他更像是个 c+,不要想差了

正式的代码非常多,我是想尽量保持入口代码简洁,只要干净的调用对象,各个代码文件之间没有耦合,有些就是需要默认的类似于类初始化变量的一些值,可能是我编程习惯不一样吧。。。

好吧😂,突然发现脱离面向对象就不会写代码了

一般写法,工厂方法

golang<br>package main<br><br>type GameStart struct {<br> cloudNumber int<br> gameStartLayers [8]*ebiten.Image<br> layerPosition [8][2]float64<br> menuList [3]*Menu<br>}<br><br>func NewGameStart() *GameStart {<br> return &amp;GameStart{<br> cloudNumber: 3,<br> layerPosition: [8][2]float64{<br> {0, 0}, {0, 0}, {0, 230}, {0, 250},<br> {0, 250}, {0, 0}, {0, 0}, {0, 0},<br> },<br> }<br>}<br><br>func main() {<br> var gameStart = NewGameStart()<br>}<br>


### 如果需要 pool 优化,还可以:
golang<br>package main<br><br>import (<br> "sync"<br>)<br><br>var initedGameStart = GameStart{<br> cloudNumber: 3,<br> layerPosition: [8][2]float64{<br> {0, 0}, {0, 0}, {0, 230}, {0, 250},<br> {0, 250}, {0, 0}, {0, 0}, {0, 0},<br> },<br>}<br><br>var gameStartPool = sync.Pool{<br> New: func() interface{} {<br> return &amp;GameStart{}<br> },<br>}<br><br>type GameStart struct {<br> cloudNumber int<br> gameStartLayers [8]*ebiten.Image<br> layerPosition [8][2]float64<br> menuList [3]*Menu<br>}<br><br>func (v *GameStart) Release() {<br> // maybe you want to release gameStartLayers and menuList here<br> // ...<br><br> gameStartPool.Put(v)<br>}<br><br>func NewGameStart() *GameStart {<br> v := gameStartPool.Get().(*GameStart)<br> *v = initedGameStart<br> return v<br>}<br><br>func main() {<br> var gameStart = NewGameStart()<br> defer gameStart.Release()<br>}<br>

pool 优化里也可以把那个 initedGameStart 去掉,*v = initedGameStart 就换成普通的赋值,或者放在 pool.Get 的 New 里,不需要每次都初始化这个 LayerPosition 字段,取决于实际需要

不是所有语言都是面向对象,比如 go 和 js,适应就好

我决定了,既然你们都这么说

看来要给大脑升级一下了,话说我 Node 也写过了,es6 语法,一直都是当面向对象写的,也有类,也有 new

好奇,你们所谓的“面向对象”语言如何优雅地初始化?有没有代码贴一下?

在Golang中,为struct初始化值有多种方式,选择哪种方式通常取决于具体的需求和代码的可读性。以下是几种常见且推荐的方法:

  1. 直接赋值:这是最直接的方法,适用于字段较少且明确知道要赋值的场景。

    type Person struct {
        Name string
        Age  int
    }
    
    p := Person{Name: "Alice", Age: 30}
    
  2. 字段顺序初始化(仅当字段顺序与声明顺序一致时):

    p := Person{"Alice", 30}
    
  3. 使用构造函数:对于更复杂的struct,可以通过定义一个函数来初始化,这有助于封装初始化逻辑和增加灵活性。

    func NewPerson(name string, age int) Person {
        return Person{Name: name, Age: age}
    }
    
    p := NewPerson("Alice", 30)
    
  4. 使用指针和默认值:对于可选字段,可以使用指针和零值来实现更灵活的初始化。

    type Person struct {
        Name *string
        Age  *int
    }
    
    name := "Alice"
    age := 30
    p := Person{Name: &name, Age: &age}
    

选择哪种方式主要取决于struct的复杂度、代码的可读性和维护性。在大多数情况下,直接赋值和构造函数是两种最常见且推荐的方法。希望这些建议对你有帮助!

回到顶部