我正在学习Go,并且对何时使用指针有些困惑。具体来说,当struct
从函数返回a 时,什么时候适合返回结构实例本身,什么时候适合返回指向该结构的指针?
示例代码:
type Car struct {
make string
model string
}
func Whatever() {
var car Car
car := Car{"honda", "civic"}
// ...
return car
}
在什么情况下我想返回一个指针,在什么情况下我 不 想要?有良好的经验法则吗?
您需要牢记两点:性能和API。
如何使用汽车?它是具有状态的对象吗?它是一个大结构吗?不幸的是,当我不知道什么是汽车时,不可能回答。说实话,最好的方法是看看别人在做什么,然后照搬别人。最终,您对这种事情有了感觉。现在,我将描述标准库中的三个示例,并解释为什么我认为它们使用了所做的事情。
hash/crc32
:该crc32.NewIEEE()
函数返回一个指针类型(实际上是一个接口,但是基础类型是一个指针)。哈希函数的实例具有状态。当您将信息写入哈希时,它会汇总数据,因此当您调用该Sum()
方法时,它将为您提供该实例的状态。
time
:该time.Date
函数返回一个Time
结构。为什么?时间就是时间。它没有状态。它就像一个整数,您可以在其中进行比较,对它们进行数学运算等。API设计人员认为,对时间的修改不会更改当前时间,而是会修改一个新时间。作为图书馆的用户,如果我想从现在开始一个月的时间,我想要一个新的时间对象,而不是更改当前的时间对象。时间也只有3个字长。换句话说,它很小,并且使用指针不会提高性能。
math/big
:big.NewInt()是有趣的一个。我们几乎可以同意,当您修改时big.Int
,您通常会想要一个新的。A big.Int
没有内部状态,那么为什么它是一个指针?答案仅仅是性能。程序员意识到,大智慧很重要。每次进行数学运算时,不断分配可能并不实际。因此,他们决定使用指针,并允许程序员决定何时分配新空间。
我回答了你的问题吗?可能不是。这是一个设计决策,您需要根据具体情况进行解决。在设计自己的库时,我以标准库为指南。实际上,所有这些都取决于判断以及您如何期望客户端代码使用您的类型。
问题内容: 我看到一些具有以下构造的代码示例: 我有C ++背景,对我来说似乎是错误。这种结构的语义是什么?是否在堆栈或堆上分配了新点? 问题答案: Go执行指针转义分析。如果指针转义了本地堆栈(在这种情况下会这样做),则在堆上分配对象。如果它没有对本地函数进行转义,则编译器可以自由地在堆栈上分配它(尽管它不作任何保证;这取决于指针转义分析是否可以证明该指针在该函数中保持局部)。
我正在学习如何在C中使用并写了以下示例: 问:是否保证在所有情况下指向一个结构的指针都是指向它的第一个元素的完全相同的指针? 在这种特殊的情况下,它能像我预期的那样工作,但我不确定它是否能得到保证。编译器可以在开始时插入一些填充吗? 我唯一能找到的关于结构类型布局的是N1570的类型: 结构类型描述了一组按顺序分配的非空成员对象(在某些情况下,还包括一个不完整的数组),每个对象都有一个可选的指定名
本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.
问题内容: 使用Go编程语言;指针如何变得有用? (如果它们没有真正的用处,为什么不非法呢?) 问题答案: 任何数据类型的有用性取决于要解决的问题和用于解决该问题的方法。如果数据类型不适合该问题,那么它根本就不适合该问题,仅此而已。 Go编程语言(以及大多数其他编程语言)基于程序员可以用来构建新数据类型的 简单 规则。其中一些规则是: :创建一个指向T的新数据类型 :Ts数组 :包含T作为组成部分
我正在学习链表,以及如何在C中使用结构和指针创建链表。下面我举一个例子。据我所知,被调用的将头节点所在的结构的开始内存位置作为参数传递。push()函数的参数将结构节点作为指向指针的指针,因此它作为引用传递,而不是实际副本。因此,我们的的第一个指针只是指向头部节点的内存位置的指针,第二个指针指向该值,该值是头部节点指向的下一个内存位置。我们通过为结构节点分配一些内存,在结构节点内创建一个名为new
问题内容: 我习惯于进行Java编程,在编程时,您无需真正考虑指针。但是,此刻我正在用C ++编写程序。在创建具有其他类成员的类时,何时应该使用指针,何时不应该使用指针?例如,什么时候我想这样做: 与此相反: 问题答案: 首先避免指针。 在以下情况下使用它们: 您想使用Pimpl习惯用法或抽象工厂。 该实例实际上是由程序的其他部分管理的,而该类仅需要能够访问它。 您想推迟对象的构建(即,您想 在