一尘不染

指向指针有什么好处?

go

使用Go编程语言;指针如何变得有用?

(如果它们没有真正的用处,为什么不非法呢?)


阅读 201

收藏
2020-07-02

共1个答案

一尘不染

任何数据类型的有用性取决于要解决的问题和用于解决该问题的方法。如果数据类型不适合该问题,那么它根本就不适合该问题,仅此而已。

Go编程语言(以及大多数其他编程语言)基于程序员可以用来构建新数据类型的 简单 规则。其中一些规则是:

  • *T:创建一个指向T的新数据类型
  • [10]T:Ts数组
  • struct { t T; u U ... }:包含T作为组成部分的结构

程序员可以通过组合这些简单的规则来创建复杂的数据类型。可能的数据类型总数超过了有用的数据类型总数。显然,存在(并且必须存在)根本没有用的数据类型。这只是建立新数据类型的规则很简单这一事实的自然结果。

类型**T属于不太可能出现在程序中的类型类别。可以写的*****T事实并不意味着这种类型必须非常有用。


最后,您的问题的答案

该类型**T通常出现在我们想要将一个类型的值的用户重定向T到另一个类型的值的上下文中T,但是由于某些原因,我们无法访问该值的所有用户,或者发现这些用户会花费太多时间:

  1. 我们不想复制类型的值T(由于某种原因)
  2. 我们希望所有类型T为值的用户都可以通过指针访问该值
  3. 我们想要 快速 将类型特定值的 所有 用户重定向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
}
2020-07-02