• The way to Go(7): 变量


    参考:

    变量

    一般格式:var identifier type

    Go在声明变量时将变量的类型放在变量的名称之后:

    • 避免像 C 语言中那样含糊不清的声明形式;
    • 能够按照从左至右的顺序阅读,使得代码更加容易理解.
    var a int
    var b bool
    var str string
    
    // 或者
    
    // 这种因式分解关键字的写法一般用于声明全局变量:
    var (
    	a int
    	b bool
    	str string
    )
    

    当一个变量被声明之后,系统自动赋予它该类型的零值。所有的内存在 Go 中都是经过初始化的。

    变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写;但如果你的全局变量希望能够被外部包所使用,则需要将首个单词的首字母也大写(可见性规则)。

    var identifier [type] = value
    var a int = 15
    var i = 5
    var b bool = false
    var str string = "Go says hello to the world!"
    

    变量的类型也可以在运行时实现自动推断:

    var (
    	HOME = os.Getenv("HOME")
    	USER = os.Getenv("USER")
    	GOROOT = os.Getenv("GOROOT")
    )
    

    这种写法主要用于声明包级别的全局变量,当你在函数体内声明局部变量时,应使用简短声明语法 :=

    示例代码:

    package main
    
    import (
    	"fmt"
       "runtime"
    	"os"
    )
    
    func main() {
    	var goos string = runtime.GOOS
    	fmt.Printf("The operating system is: %s
    ", goos)
    	path := os.Getenv("PATH")
    	fmt.Printf("Path is %s
    ", path)
    }
    

    值类型和引用类型

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

    • 程序中所用到的内存在计算机中使用字来表示;
    • 所有的字都具有 32 位(4 字节)或 64 位(8 字节)的相同长度;
    • 所有的字都使用相关的内存地址(十六进制数)来进行表示。

    值类型的变量的值存储在栈中。

    更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。

    一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(指针),或内存地址中第一个字所在的位置。

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

    打印

    package fmt 中这些打印函数:Println, Printf, Print.

    func Printf(format string, list of variables to be printed)
    

    函数 fmt.Printfmt.Println 会自动使用格式化标识符 %v 对字符串进行格式化,两者都会在每个参数之间自动增加空格,而后者还会在字符串的最后加上一个换行符。

    简短形式,使用 := 赋值操作符

    在变量的初始化时省略变量的类型,由系统自动推断。

    注意这里的使用范围是初始化变量时使用。

    a := 50
    

    这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。

    注意事项:

    • 如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=,但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值。
    • 如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误;单纯地给它赋值也是不够的,这个值必须被使用。

    同一类型的多个变量可以声明在同一行:

    var a, b, c int
    

    多变量可以在同一行进行赋值:

    a, b, c = 5, 7, "abc"
    

    上面这行假设了变量 a,b 和 c 都已经被声明,否则的话应该这样使用:

    a, b, c := 5, 7, "abc"
    

    这被称为 并行 或 同时 赋值。

    所以做两个值交换的时候,直接使用改写法即可:a, b = b, a

    并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)

    init 函数

    变量除了可以在全局声明中初始化,也可以在 init 函数中初始化。

    在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。

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

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

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

    func init() {
       // setup preparations
       go backend()
    }
    

    2017.8

  • 相关阅读:
    如何确定系统上的CPU插槽数量
    如何查找物理cpu,cpu核心和逻辑cpu的数量
    libssl.so.10: cannot open shared object file: No such file or directory
    yum安装的时候报错,关于python的函数库
    LVM分区无损增减
    LVM管理之减少LV的大小
    Windows 系统判断MD5 值的办法
    CentOS6系列系统启动常见故障排查与解决方法
    解决centos中vsftpd中文乱码
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
  • 原文地址:https://www.cnblogs.com/qq952693358/p/7337005.html
Copyright © 2020-2023  润新知