当前位置: 首页 > 科技观察

800字彻底理解Go指针

时间:2023-03-12 23:56:09 科技观察

本文适合对Go的指针或指针类型不熟悉的程序员。什么是指针?简单地说,指针是指向另一个地址的值。这是教科书上的解释,但是如果从不讲变量地址的开发语言转过来,这个解释看起来像一串楔形文字,很难理解。让我们分解一下。什么是记忆?计算机内存或RAM可以被认为是一串箱子,一个接一个地排成一行。每个框(或单元格)都标有一个唯一的数字,该数字按顺序增加;这是单元格的地址,它所在的内存位置。每个单元格存储一个值。如果您知道单元格的内存地址,则可以访问该单元格并读取其内容。或者用另一个值替换单元格中的先前值。一切都与内存有关,CPU所做的就是获取值并将其存储到内存单元中。什么是变量?写一段代码,读取内存地址200存储的值,乘以3,结果存储在内存地址201。伪代码流程如下:读取内存地址200存储的值,暂存到中央处理器;将存储在CPU中的值乘以3;将CPU存储的值存储在地址201的内存中;这就是早期程序的编写方式。程序员会保留一个内存位置列表,包括谁使用它,什么时候使用它,以及它存储的值代表什么。显然,这是繁琐且容易出错的,同时也意味着在程序编写过程中必须为存储在内存中的每一个可能的值分配一个地址。更糟糕的是,这种方法使得在程序运行时动态地为变量分配内存变得极其困难——想象一下如果您必须使用全局变量来编写大型程序。为了解决这个问题,创建了变量的概念。变量只是标识存储位置的字母数字假名。现在,我们不是在谈论存储位置,而是在谈论变量,它们是我们为内存位置提供的方便助记的名称。之前的程序现在可以表示为:读取变量a中存储的值,放入CPU;乘以3;将结果存储在变量b中;这是同一个程序,但有一个重要的改进——我们不再需要直接讨论内存位置,也不再需要跟踪它们——让编译器来做繁重的工作。现在,我们可以这样编写程序:vara=62varb=a*3编译器将确保变量a和b被分配唯一的内存位置以根据需要保存它们的值。什么是指针?现在我们知道内存是一系列编号的单元格,而变量只是标识内存位置的昵称,什么是指针?指针是指向另一个变量的内存位置的值。指针指向变量的内存地址,就像变量的标识值的内存地址一样。我们来看这段代码:1funcmain(){2a:=2003b:=&a4*b++5fmt.Println(a)6}第二行代码声明了变量a,并赋值200,接下来,变量b被声明并且变量a的地址被分配给它。请记住,我们不知道变量a存储的确切地址,但我们仍然可以将a的地址存储在b中。第四行代码是最难理解的。变量b存储变量a的地址,但我们希望将a的值递增1。为此,必须使用解除引用来获取a到b的值。然后该值递增1,结果存储在b指向的内存位置,变量a所在的位置。最后一行代码打印了a的值,也就是加1后的值201。总结如果你之前使用的语言没有指针的概念或者每个变量都有隐式指针,不要惊慌,理解变量和指针的关系需要时间和练习,记住这个规则:指针指向另一个变量内存的值地点。