为了账号安全,请及时绑定邮箱和手机立即绑定

指向指针的最佳指针是什么?

指向指针的最佳指针是什么?

Go
holdtom 2021-04-29 14:15:04
使用Go编程语言;指向指针的指针如何变得有用?(如果它们没有真正的用处,为什么它们不是非法的?)
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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

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

}


查看完整回答
反对 回复 2021-05-10
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

在C语言中,指向指针的指针很常见。例如:

  • 更多维数组(例如,字符串数组,char** argv可能是此处最突出的示例)

  • 指针作为输出参数

但是,在Go中,很少有指向指针的指针。切片类型(也可以在内部存储一个指针)而不是通过指针访问数组。因此,您仍然可以通过在Go中使用切片来获得相同类型的间接访问,但通常不会看到类似**int此处的内容。

但是,第二个示例可能仍然适用于Go程序。假设您有一个函数,应该可以更改作为参数传递的指针。在这种情况下,您将必须将指针传递给该指针,以便可以更改原始指针。这在C语言中极为常见,因为函数只能返回一个值(通常是某种错误代码),并且如果要返回附加的指针,则必须使用指向该指针的指针作为输出参数。但是,Go中的函数可以返回多个值,因此,指向指针的情况也很少见。但是它们可能仍然有用,并且在某些情况下可能会导致更好的API。

例如,atomic.StorePointer函数可能是标准库中的指针的罕见但隐藏得很好的用例之一。


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信