- 主题:实践上func是返回struct还是指针比较好
技术上都可以,但实践上哪种实现比较合适?
方式A
func funA() (structA,error){
return structA{},nil
}
方式B
func funB() (*structA,error){
return &structA{},nil
}
方式A:感觉是一种go风格,也算合理,但多处写structA{}感觉很冗余,另外会不会性能下降?
方式B:和原来的C风格接近,但error是不是显得多余了,调用者可以直接用 p==nil判断是否有效
延伸一下:
golang中是推荐用指针么?
是要避免使用指针,还是给了一种“好用”(托管内存)的指针呢?
--
修改:hothail FROM 111.206.87.*
FROM 111.206.87.*
好的,谢谢
【 在 flw (帅五进九) 的大作中提到: 】
: 两种都可以,看场景。
: 「冗余」是代码组织的问题,和指针不指针没关系。不用指针性能肯定会差一些。
: 理论上你说得对,但实践中 error 和指针并存很常见,理由很简单,nil 只能指示出错,但无法指示错误原因。C 里面强行把两个信息合并到一起,是因为 C 不支持多个返回值,Go 不存在这个问题,所以该用 error 就用吧。
: ...................
--
FROM 111.206.87.*
谢谢
【 在 gpmn (闪爷) 的大作中提到: 】
: 返回对象需要在栈上多做一次值拷贝
--
FROM 111.206.87.*
恩,谢谢线索,顺着这个,找到了下面内容:
-----------------
申请过大的空间:make的大小设定的很大。
引用指针变量一定逃逸(返回值、参数,直接修改指针变量),一定会逃逸。
Slice、Map、Channel里面有指针,一定会逃逸。
调用接口类型的方法,一定发生逃逸。
? ? ?所以,我们经常讨论的一个问题,结构体是值传递还是指针传递?值传递会有内存
拷贝,分配在栈区。指针传递会逃逸在栈区,虽然没有内存拷贝的过程,但GC压力会变
大。如果使用很长的slice或map,还是用指针传递吧。
--------------------
一般数据差别不大,只是对大量数据时做一些权衡
【 在 littleSram (littleSram) 的大作中提到: 】
: 这个非常复杂
: 通常的说法是不确定的情况下,用指针
: 但是用指针会导致编译器认为指针逃逸,因此可能会增加一次内存分配。
: ...................
--
FROM 111.206.87.*