根据Go中的响应和注释:引用类型作为参数Go似乎没有"官方"的类型。称为"引用类型"。
然而,有一些类型实际上保存了指向底层数据的指针,这允许有效地将这些类型的值作为函数参数传递,而不需要指向它们的指针。当这样的值作为函数实参传递时,不会(或很少)复制底层数据,因此,如果程序员接受指向该类型的指针,并将该指针作为函数实参传递,而不是将值作为函数实参传递,则不会(或很少)提高效率。
这些类型是切片地图,和通道根据公认的答案
官方Effective Go文档将切片描述为:
slice保存对底层数组的引用,如果将一个slice赋值给另一个slice,则两个slice都指向同一个数组。如果函数接受slice参数,则调用者可以看到它对slice元素所做的更改,类似于传递指向底层数组的指针。
地图:
与片一样,映射包含对底层数据结构的引用。如果你将一个映射传递给一个改变了映射内容的函数,这些改变将在调用者中可见。
和Channels as:
与映射一样,通道使用make分配,结果值作为对底层数据结构的引用。
文档似乎避免使用术语"引用类型";不管出于什么原因但还是提到了"参考"这个词;
这些类型的特殊之处在于,可以将nil
赋值给这种类型的值,类似于指针类型(doc):
值
x
可赋值给类型为T
("如果符合下列条件之一,x
可转让给T
"):
…
x
为预先声明的标识符nil
,T
为指针、函数、切片、映射、通道或接口类型。
在程序员的日常实践中很重要要知道,清楚地区分和清楚地传达类型或数据结构,这些类型或数据结构作为函数参数传递时共享底层数据,而不是不共享(但复制)底层数据。
能够引用切片地图,和通道作为一个单独的群体,程序员在与他人(尤其是初级程序员)进行对话时,清晰的沟通有助于确保程序中的数据安全,并识别/防止与共享安全相关的危险。
一般如何调用这组类型?
通常如何调用这组[片、映射、函数和方法以及通道]类型?
这个问题是错误的,因为方法在Go中不是类型,而函数类型只是函数,不适合讨论"引用"。假设您想讨论切片、映射、闭包和缓冲通道:
它们被称为"切片"、"映射"、"闭包"one_answers"缓冲通道"。也许没有必要为这四种动物命名:它们没有太多的共同之处。
下面四种类型显示引用语义:片、映射、闭包和缓冲通道。(未缓冲的通道没有)。
- slice是一种值类型,它将视图呈现到后台数组中。因此,对于存储在后台数组中的值,它具有引用语义。
- map是一个map,并且具有关于存储在map中的值的引用语义。(这是最接近引用类型的。)
- 函数关闭器是闭包,很复杂,在价值所有权的基础上与下级讨论它们可能没有帮助)。
- 一个缓冲通道显示了关于缓冲值的引用语义。
不需要一个复杂的术语(除非你在学术界工作,分类、分离和分类是你的生活)