• go语言笔记——指针,和C用法以及本质一样,但不支持指针的+-运算!


    4.4.2 值类型和引用类型

    所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值。

    Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

    示例 4.22 string_pointer.go

    package main
    import "fmt"
    func main() {
    	s := "good bye"
    	var p *string = &s
    	*p = "ciao"
    	fmt.Printf("Here is the pointer p: %p
    ", p) // prints address
    	fmt.Printf("Here is the string *p: %s
    ", *p) // prints string
    	fmt.Printf("Here is the string s: %s
    ", s) // prints same string
    }

    输出:

    Here is the pointer p: 0x2540820
    Here is the string *p: ciao
    Here is the string s: ciao

    通过对 *p 赋另一个值来更改“对象”,这样 s 也会随之更改。

    内存示意图如下:

     

    传递指针给函数不但可以节省内存(因为没有复制变量的值),而且赋予了函数直接修改外部变量的能力,所以被修改的变量不再需要使用 return 返回。如下的例子,reply 是一个指向 int 变量的指针,通过这个指针,我们在函数内修改了这个 int 变量的数值。

    示例 6.6 side_effect.go

    package main
    
    import (
        "fmt"
    )
    
    // this function changes reply:
    func Multiply(a, b int, reply *int) {
        *reply = a * b
    }
    
    func main() {
        n := 0
        reply := &n
        Multiply(10, 5, reply)
        fmt.Println("Multiply:", *reply) // Multiply: 50
    }

    在 Go 语言中,指针(第 4.9 节)属于引用类型,其它的引用类型还包括 slices(第 7 章),maps(第 8 章)和 channel(第 13 章)。被引用的变量会存储在堆中,以便进行垃圾回收,且比栈拥有更大的内存空间。

     在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)

    4.4.5 init 函数

    变量除了可以在全局声明中初始化,也可以在 init 函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。

    每一个源文件都可以包含一个或多个 init 函数。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。

    一个可能的用途是在开始执行程序之前对数据进行检验或修复,以保证程序状态的正确性。

    示例 4.6 init.go:

    package trans
    
    import "math"
    
    var Pi float64
    
    func init() {
       Pi = 4 * math.Atan(1) // init() function computes Pi
    }

    在它的 init 函数中计算变量 Pi 的初始值。

    示例 4.7 user_init.go 中导入了包 trans(在相同的路径中)并且使用到了变量 Pi:

    package main
    
    import (
       "fmt"
       "./trans"
    )
    
    var twoPi = 2 * trans.Pi
    
    func main() {
       fmt.Printf("2*Pi = %g
    ", twoPi) // 2*Pi = 6.283185307179586
    }

    init 函数也经常被用在当一个程序开始之前调用后台执行的 goroutine,如下面这个例子当中的 backend()

    func init() {
       // setup preparations
       go backend()
    }
  • 相关阅读:
    Redis-Sp:Redis主要功能
    Redis-Sp:Redis介绍
    阿里云-Redis-Help-连接实例-Redis客户端连接:C#客户端StackExchange.Redis
    Samba通过ad域进行认证并限制空间大小《转载》
    SQL函数简述
    SELECT--UNION,UNION ALL,MINUS, INTERSECT,EXISTS
    oracle数据库常用查询一
    oracle以web方式登录EM、ISQLPlus
    关于sys、system、sysman等在EM中登录的问题
    top 命令SQLServer-sybase-oracle
  • 原文地址:https://www.cnblogs.com/bonelee/p/6861236.html
Copyright © 2020-2023  润新知