• Go 变量(var) & 常量(const)


    变量

    声明变量格式:

    var var_name var_type
    

    变量在声明时会自动初始化:

    数字: 0
    string: ""
    bool: false
    引用类型: nil
    结构体: 所有元素或成员的零值
    

    var 通常用于与初始化表达式类型不一致的局部变量、后面再赋值或初始值不重要的情况,否则可以使用更加简便的短变量声明

    短变量声明

    短变量声明更加简便,变量类型会通过变量初始值自动判断
    短变量声明用于局部变量声明,最少声明一个变量

    a := 1
    

    多变量赋值

    多个变量可以在一起赋值

    var a, b, c int
    d, e, f := 1, 2, "I'm F"
    
    var(
    	a = 1
    	b int
    )
    

    局部变量

    局部变量声明就必须使用,否则编译时会报错

    // 可以先声明,再初始化
    var a int
    a = 1
    
    // 可以在声明的同时进行初始化
    var a int = 1
    // Go 可以在初始化的时候自动判断变量类型,所以 int 可以省略
    var a = 1
    
    // var a = 1 的简略写法,同样会自动判断
    a := 1
    

    全局变量

    全局变量声明后可以不使用,编译时不会报错
    全局变量首字母必须大写,否则从其他包中就无法访问到
    由于所有语句必须在函数中,所以无法通过 := 声明全局变量,全局变量只能通过 var 进行声明

    var A int = 1
    

    或者可以通过初始化函数对其进行初始化

    var A int
    
    func init() {
    	A = 3
    }
    

    只写变量 _

    由于 Go 中不允许出现局部变量声明后不使用的情况,但是有时会出现需要接收一个值,但是之后又不会用到
    如果直接声明一个变量去接收,由于之后没有用到,所以编译无法通过,这时就可以使用只写变量 _ 来接收之后用不到的值

    变量作用域

    函数内声明的变量是局部变量,只在函数内有效
    函数外部声明的是全局变量,如果首字母小写,只能在当前包中访问;如果首字母大写,可以在其他包中访问到

    变量的生命周期

    变量的生命周期由变量是否可达决定
    包级别变量的生命周期是整个程序的执行时间
    局部变量的生命周期则不一定

    逃逸

    示例:

    var global *int
    func foo() {
    	x := 1
    	global = &x
    }
    

    虽然 x 是局部变量,但是由于 global 引用了 x,所以即使函数返回,x 仍然可达,不会被回收,这时 x 从 foo 中逃逸

    常量

    常量在编译时就会确定,之后无法修改
    常量声明和变量相似,但是声明时必须要有值
    格式:

    const const_name const_type = value
    

    变量的类型可以省略

    多行声明:

    const(
    	blog = "cnblogs.com/dbf-/"
    	Pi = 3.14159
    )
    

    计算表达式

    常量可以使用计算表达式,但是只能用内置的常量计算表达式

    const(
    	a = "123"
    	length = len(a)
    )
    

    自动填充

    在给第一个常量赋值之后,如果之后的没有赋值,就会自动赋为上面的值

    常量生成器 (iota)

    声明常量时可以通过 iota 实现自增
    示例:

    package main
    
    import "fmt"
    
    const(
    	a = iota
    	b = "string"
    	c
    	d = iota
    	e
    )
    const(
    	f = iota
    	g
    	h
    )
    
    func main() {
    	fmt.Println(a, b, c, d, e)
    	fmt.Println(f, g, h)
    }
    
    

    输出结果:

    0 string string 3 4
    0 1 2
    

    在一个 const 中使用 iota 后,就会自动从第一个开始计数,为之后每一个常量分配一个值,虽然中间被其他的赋值打断,但是计数器仍然在工作
    在一个新的 const 中,计数器会重新计数

    值类型

    基本数据类型:int、float、bool、string、struct 等都是值类型
    值类型中储存的就是值
    内存通常在栈中分配

    引用类型

    指针、切片、map、chan 等都是引用类型
    引用类型中储存的是内存地址,内存地址指向的才是值
    内存通常在堆中分配

  • 相关阅读:
    从Github上将laravel项目拉到新开发环境
    Nginx-Primary script unknown的报错的解决方法
    CentOS 7 安装PHP7+Nginx+Mysql5.7开发环境
    程序员面试经常会被问到的12个问题
    IOC(控制反转)的理解
    用冒泡排序的方法将数组从小到大排列
    常用设计模式详解
    PHP常见面试题总结
    能够遍历一个文件夹下的所有文件和子文件夹的函数
    线特征---LineMatching原理(四)
  • 原文地址:https://www.cnblogs.com/dbf-/p/12059706.html
Copyright © 2020-2023  润新知