- 主题:golang中结构体函数值传递为了什么场景?
比如代码:
type Person struct{
Name string
}
func (p Person) change(name string){
p.Name = name
}
func main() {
p := Person{Name : "one"}
p.change("two")
}
我理解的是,如果指针传递(func (p *Person) change(name string)),那就相当于c++中的this指针,值传递是为了什么场景设计的?每次都会产生临时变量,效率很低吧?
--
FROM 222.129.48.*
但是我打印两个结构体的地址(main和change中),不一样了,不是产生了一个临时变量吗?而且对Name赋值后,回到main里,Name又恢复原来的值了,这不是产生临时变量了吗?
【 在 hotfix 的大作中提到: 】
: 你是说p吗,在这里是接受者,没有发生值拷贝
: :
--
FROM 222.129.48.*
不好意思, 是我理解错了
【 在 buildtolast 的大作中提到: 】
: 但是我打印两个结构体的地址(main和change中),不一样了,不是产生了一个临时变量吗?而且对Name赋值后,回到main里,Name又恢复原来的值了,这不是产生临时变量了吗?
:
: 【 在 hotfix 的大作中提到: 】
: : 你是说p吗,在这里是接受者,没有发生值拷贝
: --
:
--
修改:hotfix FROM 36.110.18.*
FROM 114.247.88.*
应该是效率更高,不需要把函数中的处理结果带出来就可以适用
--
FROM 120.245.29.*
我能想到的
1)跟你说的差不多,本来就需要一个临时的副本,可以少打几个字
比如本来就没有返回值
func (p *Person)change(){
temp := *p (指针传递)
....
}
2)恰恰相反,需要返回一个副本
func (p *Person)clone() Person{
temp := *p (指针传递)
....
return temp
}
但是就为了少打几个字,弄出一个复杂的语言特性,让人晕头转向,不知道值得不值得。
【 在 xunery 的大作中提到: 】
: 应该是效率更高,不需要把函数中的处理结果带出来就可以适用
--
FROM 222.129.48.*
传值是为了满足“值语义”,就是不修改传入的变量本身的值,而是传入这个变量的一份copy。
传引用是为了满足修改的语义,传入的变量的值可能会被修改。
go编译时有逃逸分析,可以减少变量值的copy。
可以用 go build -gcflags="-m" 查看逃逸分析结果
【 在 buildtolast 的大作中提到: 】
: 比如代码:
:
: type Person struct{
: ...................
--
FROM 111.199.147.*
所以还是为了少打几个字吧?我还是觉着效率低,容易让初学者误用,如果有类似c++ const的约束会好很多。
【 在 z16166 的大作中提到: 】
: 传值是为了满足“值语义”,就是不修改传入的变量本身的值,而是传入这个变量的一份copy。
: 传引用是为了满足修改的语义,传入的变量的值可能会被修改。
: go编译时有逃逸分析,可以减少变量值的copy。
: ...................
--
FROM 222.129.48.*
为了防止原始对象被篡改
【 在 buildtolast 的大作中提到: 】
: 比如代码:
:
: type Person struct{
: Name string
: }
:
: func (p Person) change(name string){
: p.Name = name
: }
:
: func main() {
:
: ..................
发自「今日水木 on ELS-AN00」
--
FROM 124.64.19.*
先学个c不好吗
【 在 buildtolast 的大作中提到: 】
: 比如代码:
: type Person struct{
: Name string
: ...................
--
FROM 111.199.187.*
不好,懒得学,要你管
【 在 iwantfly 的大作中提到: 】
: 先学个c不好吗
:
--
FROM 222.129.48.*