go 通过构造函数创建结构体指针和结构体变量的差异

在学习 go 语言结构时,遇到这样一个问题:

  • 通过自建构造函数,返回一个结构体变量,或者返回一个结构体指针,他们的区别是什么?
  • 因为二者都可以让我们生成我们所需要的结构体,那为什么还要去使用返回结构体指针的构造函数呢?

对于此疑问,我做了如下实验:

type person struct {
    name string
    age int
}

// newPerson 返回一个结构体变量
func newPerson(name string,age int) person{
	ret := person{
		name: name,
		age: age,
	}
    // 在创建结构体时,返回其内存地址
	fmt.Printf("%p\n",&ret)
	return  ret
}

// newPerson2 返回一个结构体指针
func newPerson2(name string,age int) *person{
	ret := &person{
		name: name,
		age: age,
	}
    // 在创建结构体指针时,返回他储存的结构体的地址
	fmt.Printf("%p\n",ret)
	return ret
}

func main(){
    p1 := newPerson("张三", 1)
    fmt.Printf("%p\n", &p1)
    p2 := newPerson2("李四", 2)
    fmt.Printf("%p\n", p2)
	    
}
F:\Go_project\my_go\student_manager>go
 run struck_poniter.go
// 以下是调用构造函数newPerson时,返回的结构体变量的地址
0xc000096460
// 以下是调用构造函数newPerson时,创建的结构体实例的地址
0xc000096440
// 以下是调用构造函数newPerson2时,返回的结构体指针的地址
0xc0000964a0
// 以下是调用构造函数newPerson2时,创建的结构体指针的地址
0xc0000964a0

由此可得出结论

使用构造函数创建 结构实例时:

两点:1.go 语言中函数的传参是值的传递,2.go语言中的结构体是值类型的

如果构造函数返回的是一个结构体变量,在创建结构体实例时,是将构造函数中生成的结构体变量的值传给对应新创建的结构体变量,在上例字中对应的就是 p1,此时内存中就有值相同的两份结构体

如果构造函数返回的是一个结构体指针(newPerson2函数),构造函数最后是将该函数创建的结构体所对应的地址传给了我们创建的实例p2,注意,此时p2是一个结构体指针,这种创建方式,内存中只有一份结构体,对内存的消耗小

试想,如果我们的结构体中含有很多个成员,并且在我们的程序中,通过返回值是结构体变量的构造函数创建了很多个结构体,此时构造函数会生成对应的结构体,并分别将至复制给对一个你的结构体实例,这样会产生很多不必要的内存开销,此时如果使用返回值是结构体指针的构造函数来进行结构体实例的创建,就会避免

以上就是我在学习go时,对go 自建构造函数,返回值是结构体变量,或者结构体指针的原因的一个理解

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值