欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Language Mechanics On stacks And Pointers--golang

程序员文章站 2022-03-11 18:41:47
...

golang堆栈和指针的语言机制

前言

  1. 本节专注于:栈和指针。

介绍

  1. 当使用指针不正确时,可能会产生bug或性能问题。特别是当写多线程软件时。所以很多编程语言试图从开发者的角度去隐藏指针。然而,如果你想使用go去编程,你没有任何方式可以去避免它。对指针没有很深的理解,你将很难去写出干净,简洁,高效的代码。

范围界限

  1. 在范围界限内执行的函数,将为每个对应的函数提供单独的内存空间。每个框架允许一个函数在他们的上下文执行,并且提供流量控制。每个函数在它的框架内通过指针可以直接访问内存,但是访问它边界外的内存要求间接访问。一个函数访问它框架外的内存时,这个内存必须是被共享给该函数的。首先要理解和学习这个些框架边界所设定的限制和机制。
  2. 当一个函数被调用,在两个范围之间发生过渡。代码从调用函数的执行范围准换到被调用函数的范围内。如果函数调用外部数据,那这个数据必须从一个函数执行传递至另一个函数。go语言中,在两个函数间传递的数据被叫做 值传递
  3. 通过 值传递 数据的好处是可读性。主调函数中的值将被拷贝至被调函数。这就是为什么我把值传递表达为所即所得,因为你看到的就是你得到的。值传递的规则决定了 两个函数之间同等开销。有助于保持一个好的预期模型,即一个函数调用所花费的开销明确。
  4. 下面为通过值传递的示例:
package main

func main() {
    // Declare variable of type int with a value of 10.
    count := 10
    // Display the "value of" and "address of" count.
    println("count:\tValue Of[", count, "]\tAddr Of[", &count, "]")
    // Pass the "value of" the count.
    increment(count)
    println("count:\tValue Of[", count, "]\tAddr Of[", &count, "]")
}
//go:noinline
func increment(inc int) {
    // Increment the "value of" inc.
    inc++
    println("inc:\tValue Of[", inc, "]\tAddr Of[", &inc, "]")
}

引用

  1. https://www.goinggo.net/2017/05/language-mechanics-on-stacks-and-pointers.html
相关标签: golang