请问老师,这个有画流程图吗?又是对象又是地址我实在是理不清楚

来源:4-3 扩展已有类型

SuperDi

2021-11-14

图片描述
我理解的传进来的q是一个指针,那就是一个地址值
append (*q, c) 返回一个新的切片对象,也是一个指针,因此也是返回的一个地址值,返回的地址使用 *q来接收,是不是相当于把原来q的指向地址给改了?
意思就是执行完这个函数之后,q已经不是原来的q了,因为指针的地址已经改变了?

写回答

1回答

ccmouse

2021-11-15

Queue部分画流程图帮助不大,不过的确这里的指针在理解上是个难点。我在考虑把它讲的再细一些。

普通版:

var a []int

a = append(a, v)

append返回的是[]int。

指针版:

var a []int

var q *[]int = &a

*q = append(*q, 3)

这段运行之后,a是什么呢?[3]。我们通过*q来操作了变量a,使得它发生了改变。

Queue的方法版:

q.Push接收者(q *Queue)其实跟一般的函数参数一样,只是语法上不一样。a.Push就相当于:(为了说明方便,我们假设使用的时候这个叫做a)

(&a).Push

这里的q就相当于上面被赋值成了&a,通过这个方法调用,改变了变量a。

而实际上我们一般到处都叫q,所有外面会说q.Push,这里的q是[]int,但是穿参进方法之后,方法里面的q和外面的q不是同一个变量,里面的q是*[]int类型,通过*q来改变外面的q。

0
1
SuperDi
普通版: var a []int a = append(a, v) append返回的是[v]。a 没有被改变,append 返回了一个新的slice,我们恰巧用变量a接收,实质上原来的a没变 我好像明白了,谢谢老师的耐心解答!必须好评!
2021-11-15
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程