我知道Go没有任何构造函数New func,而是在其中使用a ,但是根据此示例。
New func
func NewFile(fd int, name string) *File { if fd < 0 { return nil } f := File{fd, name, nil, 0} return &f }
他们总是回来&f。为什么仅仅返回File就还不够?
&f
File
更新资料
我尝试过为简单的结构返回创建的对象,这很好。因此,我想知道返回地址是否是构造函数的标准方法或其他方法。
谢谢。
如前所述,是的,规范允许您返回值(作为非指针)或指针。这只是您必须做出的决定。
什么时候返回指针?
通常,如果您返回的值作为指针“更有用”。什么时候更有用?
例如,如果它有 很多使用指针接收器的方法 。是的,您可以将返回值存储在变量中,这样它就可以寻址,并且仍然可以调用具有指针接收器的方法。但是,如果立即返回一个指针,则可以“链接”方法调用。请参阅以下示例:
type My int func (m *My) Str() string { return strconv.Itoa(int(*m)) } func createMy(i int) My { return My(i) }
现在写:
fmt.Println(createMy(12).Str())
将导致错误: cannot call pointer method on createMy(12)
cannot call pointer method on createMy(12)
但是如果返回指针,如果可行:
func createMy(i int) *My { return (*My)(&i) }
同样,如果将返回的值存储在不可寻址的数据结构中(map例如),则由于索引的值不可寻址,因此无法通过索引映射来对值调用方法。
map
参见以下示例:My.Str()具有指针接收器。因此,如果您尝试这样做:
My.Str()
m := map[int]My{0: My(12)} m[0].Str() // Error!
您不能因为 “无法使用的地址m[0]”。但是以下工作原理:
m[0]
m := map[int]*My{} my := My(12) m[0] = &my // Store a pointer in the map m[0].Str() // You can call it, no need to take the address of m[0] // as it is already a pointer
指针有用的另一个示例是,如果 它是一个“大”结构,它将被大量传递 。http.Request是一个光辉的例子。它很大,通常会大量传递给其他处理程序,并且具有带有指针接收器的方法。
http.Request
如果返回一个指针,通常表明如果将其存储并作为指针传递,则返回的值更好。