golang
golangc++pythonjavagolangmapslicepythonjavagolanggolanggolanggcc语言
golangc++c

看似为引用的一些现象

map、slice

sliceslicec++vectorsliceslicesliceslicesliceslicegolangappenddelete
slice

例如

func f(a []int)
{
	a = append(a,1)
	a[len(a)-1]=2
}
fmapslicechannal
capafslicec++cc++cgolang
s1 := make([]int, 0, 10)
s1 = append(s1, 1)
s1 = append(s1, 2)
s2 := s1
s2 = append(s2, 3)
s1 = append(s1, 4)
for _, v := range s1 {
	print(v, " ")
}
print("\n")
for _, v := range s2 {
	print(v, " ")
}
print("\n")
golang
1 2 4                                                     
1 2 4   

map的原理差不多,就不赘述了。

a = append(a,1)slicemapappendslicemapslicemap
getslice

channel

golangchannelchannel<-->channel

mutex、sync.map

syncmutexmutexsync.map

闭包

闭包中的捕获变量,从编辑器的角度上和原变量是同一个符号。从定义上来看是不能说是引用的。

有关于指针

golangmodern clang*指针指针golang

对于以下类型A。

type A int
func (receiver *A) ptr() {
}
func (receiver A) noptr() {
}

以下的调用都是合法的。

a := A(0)
a.ptr()
a.noptr()
b := &a
b.ptr()
b.noptr()
abgolangpanicerr
golangc

笔者建议:

protobufgolang

此外。在设计上需要注意指针尽量封装在模块内部,模块则以组合加载的形式封装在大模块内部,不要过度使用裸指针。