我知道围棋没有任何构造器,在它的位置使用了New func,但根据this example.

func NewFile(fd int, name string) *File {
  if fd < 0 {
    return nil
  }
  f := File{fd, name, nil, 0}
  return &f
}

他们总是返回&f.为什么仅仅返回File是不够的?

Update

我已经try 过为一个简单的 struct 返回创建的对象,这很好.所以,我想知道返回地址是否是一种标准的构造方法或其他方法.

谢谢

推荐答案

如前所述,是的,规范允许您返回值(作为非指针)或指针.这只是你必须做出的决定.

When to return pointer?

通常情况下,如果您返回的值作为指针"更有用".什么时候更有用呢?

例如,如果它有many methods with pointer receiver.是的,您可以将返回值存储在变量中,因此它将是可寻址的,并且您仍然可以调用其具有指针接收器的方法.但是如果立即返回一个指针,您就可以"链接"方法调用.请参阅此示例:

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)

但是,如果您返回一个指针,则IF会起作用:

func createMy(i int) *My { return (*My)(&i) }

此外,如果将返回的值存储在不可寻址的数据 struct 中(例如map),则无法通过索引映射来调用值的方法,因为映射的值不可寻址.

请看这个例子:My.Str()有指针接收器.因此,如果您try 这样做:

m := map[int]My{0: My(12)}
m[0].Str() // Error!

你不能因为"cannot take the address of 100".但以下是有效的:

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

指针有用的另一个例子是if it is a "big" struct which will be passed around a lot.http.Request是一个光辉的例子.它很大,通常会传递很多给其他处理程序,并且有带指针接收器的方法.

如果您返回一个指针,这通常意味着返回值如果作为指针存储和传递会更好.

Go相关问答推荐

Go协议缓冲区导入问题

如何修复Go中调用GetRawInputDeviceInfA Windows API函数时的错误?

map 中的多个函数类型,Golang

格式化 Azure SDK 的 golang 时间

正则表达式模式,确保至少一个字符与其他条件一起存在

如何将验证器标记添加到嵌套字段

Yocto 无法交叉编译 GoLang Wails 应用程序

如何以干净的方式在中间件中注入 repo 或服务?

GoLang:net.LookupHost 返回重复的 ips

Golang crypto/rand 线程安全吗?

Golang代码判断第一个词是否可以从第二个词形成

GqlGen - 在字段解析器中访问查询输入参数

try 运行 docker-compose up -d 时出现错误

如果服务器在客户端的 gRPC 中不可用,则等待的方法

如何在golang中使用ozzo验证进行时间最大验证

使用 xml.Name 将 xml 解组为 [] struct

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

如何在 Unmarshal 中使用泛型(转到 1.18)

如何扩充 ResponseWriter 的 Header() 返回的 map

map和struct golang的合并