3 回答
TA贡献1829条经验 获得超6个赞
任何数据类型的有用性都取决于要解决的问题和用于解决该问题的方法。如果数据类型不适合该问题,那么它根本就不适合该问题-仅此而已。
Go编程语言(以及大多数其他编程语言)基于程序员可以用来构建新数据类型的简单规则。其中一些规则是:
*T
:创建一个新数据类型,该数据类型是指向T的指针[10]T
:Ts数组struct { t T; u U ... }
:包含T作为组成部分的结构...
程序员可以通过组合这些简单的规则来创建复杂的数据类型。可能的数据类型总数超过了有用的数据类型总数。显然,存在(并且必须存在)完全没有用的数据类型。这只是建立新数据类型的规则很简单这一事实的自然结果。
类型**T
属于不太可能出现在程序中的类型类别。可以写的*****T
事实并不意味着这种类型必须非常有用。
最后,您的问题的答案:
该类型**T
通常出现在我们想要将一个类型的值的用户重定向T
到另一个类型的值的上下文中T
,但是由于某些原因,我们无法访问该值的所有用户,或者发现这些用户会花费太多时间:
我们不想复制类型的值
T
(由于某种原因)我们希望所有类型
T
为值的用户都可以通过指针访问该值我们想要快速将类型为特定值的所有用户重定向
T
到另一个值
在这种情况下,使用**T
是很自然的,因为它允许我们在O(1)中实现第三步:
type User_of_T struct {
Value **T
}
// Redirect all users of a particular value of type T
// to another value of type T.
func (u *User_of_T) Redirect(t *T) {
*(u.Value) = t
}
TA贡献1877条经验 获得超6个赞
在C语言中,指向指针的指针很常见。例如:
更多维数组(例如,字符串数组,
char** argv
可能是此处最突出的示例)指针作为输出参数
但是,在Go中,很少有指向指针的指针。切片类型(也可以在内部存储一个指针)而不是通过指针访问数组。因此,您仍然可以通过在Go中使用切片来获得相同类型的间接访问,但通常不会看到类似**int
此处的内容。
但是,第二个示例可能仍然适用于Go程序。假设您有一个函数,应该可以更改作为参数传递的指针。在这种情况下,您将必须将指针传递给该指针,以便可以更改原始指针。这在C语言中极为常见,因为函数只能返回一个值(通常是某种错误代码),并且如果要返回附加的指针,则必须使用指向该指针的指针作为输出参数。但是,Go中的函数可以返回多个值,因此,指向指针的情况也很少见。但是它们可能仍然有用,并且在某些情况下可能会导致更好的API。
例如,atomic.StorePointer函数可能是标准库中的指针的罕见但隐藏得很好的用例之一。
- 3 回答
- 0 关注
- 220 浏览
添加回答
举报