Golang Go语言中一个构造结构体的方法

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

Golang Go语言中一个构造结构体的方法

假设要构造 testStruct 这个结构体, 常规方法是写一个 func NewStruct() testStruct 函数

这里的方法是 将这个函数 改写成结构体方法 func (s *testStruct) New() *testStruct

比较一下使用时的不同:

_ = NewStruct()

_ = (&testStruct{}).New()

可以发现 New 这个函数被约束到了 testStruct 命名空间下, 这也是我的主要目的

完整的测试用例:

基准测试中, 两种方式的执行效率几乎一致,当 struct 很大时, (&testStruct{}).New()略有优势

package main

import ( “testing” )

type testStruct struct { value int }

// 三种构造结构体的方法

func NewStruct() *testStruct { // 逃逸 return &testStruct{} }

func NewStruct2() testStruct { // 不逃逸 但传值时发生拷贝 return testStruct{} }

func (s *testStruct) New() *testStruct { // 不逃逸,只拷贝了指针 // 更重要的是收束到了 testStruct 这个命名空间里 return s }

func TestNew(t *testing.T){ _ = (&testStruct{}).New() //fmt.Println(s) }

func BenchmarkNew(b *testing.B){ for i := 0;i<b.N;i++{ _ = (&testStruct{}).New() } }

func BenchmarkNew2(b *testing.B){ for i := 0;i<b.N;i++{ _ = NewStruct() } }


更多关于Golang Go语言中一个构造结构体的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

这种写法是受了 OO 思想的影响,最好还是不要用 OO 的思想去写 Go 。

更多关于Golang Go语言中一个构造结构体的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


「构造函数」的本质是「无中生有」,第三种是「有中生有」,不配称作「构造函数」。

func (s *testStruct) New() *testStruct

都已经有了&testStruct{}, 为啥还要 New 一个?

你这是初始化,并不是分配,所以应该叫 Init,不叫 New

可以无限的 New 下去
(&testStruct{}).New().New().New()

在Go语言中,构造结构体(struct)的方法通常不是通过传统的面向对象编程语言中的构造函数来实现的,因为Go没有直接的构造函数概念。不过,我们可以通过多种方式来实现类似构造结构体的功能。

一种常见的方法是定义一个普通的函数,该函数返回该结构体的实例,并在函数内部对结构体的字段进行初始化。这种方式既灵活又直观。

例如,假设我们有一个表示人的结构体Person,它有两个字段:NameAge。我们可以这样定义一个构造函数:

type Person struct {
    Name string
    Age  int
}

// NewPerson 是一个构造函数,返回初始化后的 Person 实例
func NewPerson(name string, age int) Person {
    return Person{
        Name: name,
        Age:  age,
    }
}

在这个例子中,NewPerson函数就是我们的“构造函数”,它接受两个参数(nameage),并返回一个初始化后的Person结构体实例。

使用这种方法,我们可以轻松地创建和初始化结构体的实例,同时保持代码的清晰和可维护性。

此外,如果结构体包含复杂的初始化逻辑,或者需要依赖注入等高级功能,可以考虑使用工厂模式或依赖注入框架来实现结构体的构造和初始化。不过,在大多数情况下,简单的函数就已经足够满足需求了。

回到顶部