当前位置: 首页 > 面试题库 >

Go的构造函数为什么要返回地址?

栾和玉
2023-03-14
问题内容

我知道Go没有任何构造函数New func,而是在其中使用a
,但是根据此示例。

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

他们总是回来&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)

但是如果返回指针,如果可行:

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

同样,如果将返回的值存储在不可寻址的数据结构中(map例如),则由于索引的值不可寻址,因此无法通过索引映射来对值调用方法。

参见以下示例:My.Str()具有指针接收器。因此,如果您尝试这样做:

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

您不能因为 “无法使用的地址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是一个光辉的例子。它很大,通常会大量传递给其他处理程序,并且具有带有指针接收器的方法。

如果返回一个指针,通常表明如果将其存储并作为指针传递,则返回的值更好。



 类似资料:
  • 问题内容: 如果我在构造函数中返回一些值或对象,那么var会得到什么? 在两种情况下都会得到什么n? 其实这是一个测验问题,答案是什么? 自定义对象构造函数返回什么? a)新实例化的对象 b)未定义-构造函数不返回值 c)不论return语句是 d)等于return语句是什么;新实例化的对象(如果没有return语句) 问题答案: 我发现了这个很棒的链接: 上面提到的第二点魔术是构造函数返回特定的

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 在上面的代码中,执行以下语句时不调用复制构造函数: 既然返回是按值的,为什么不调用复制构造函数? 谢啦

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回

  • 允许您执行以下操作: 但不是这个: 可能是因为返回类型不是函数签名的一部分。但是是一个类类型,它被赋予一个返回类型,并且知道构造它的函数对象的返回类型。所以这里可能有编译器错误。 为什么没有编译器错误?

  • 问题内容: 除了使用关键字调用构造函数时,Java语言中的语句可以返回值的确切情况是什么? 例: 如果我没记错的话,如果它是一个非函数原语,将被返回。否则返回。这个对吗? 换句话说,什么值可以引起? 问题答案: 确切的条件在内部属性上进行了描述,该属性由操作员使用: 来自ECMA-262第3条。版本规格: 13.2.2 调用对象的属性时,将执行以下步骤: 创建一个新的本机ECMAScript对象。