基础语法 - 变量

变量声明和定义

  • 使用关键词 var或自动推导。
  • 在一个作用域内,一个变量的声明只能出现一次;定义可零次可声明的同时定义。

只声明

  • 语法:var 变量名 变量类型
  1. 声明单个变量
var a int
  1. 声明多个同类型的变量
var a,b,c int
  1. 声明一组非同类型变量,
var (
    str      string  
    avg, sum int 
)
  • 不同于C和C++ 未初始化的变量值为内存历史值,go未初始化的变量,系统会自动赋予该类型的零值。

变量零值

  1. 值类型
  • bool 的零值为 false
  • 整数的零值为 0
  • 浮点数的零值为 0.0
  • string 的零值为 空字符串 “”
  1. 引用类型(pointer, function, interface, slice, channel, map)的零值为 nil
  2. 聚合类型(array, struct)的零值为每个字段都是该类型对应的零值

声明的同时定义

  • 基础语法:var 变量名 变量类型 = 变量值
  1. 单个变量
var a int = 1
  1. 多个同类型的变量
var a, b string = "hello", "world"
  1. 一组非同类型变量
var (
    str      string = "test"  
    avg, sum int = 1, 2
)
  • 变量类型自动推导,由于变量声明的同时定义,编译器可以通过定义的值自动推导出变量的类型,可以省略声明中的变量类型,
  1. 基本语法:var 变量名 = 变量值;例如:
var c, d, e = 1, 3.5, "hello" // 类型:int float64 string
  1. 简略语法:变量名 := 变量值;例如:
a, b, c := 1, true, "message" // 类型:int, bool, string

自动推导问题

  1. 有些写法可能会出现异议,导致go编译器无法推导出来,例如:
数组 正确写法
a := []int{1,2,3}
写成
a := {1,2,3} 或者 a := []{1,2,3}
  1. 简略语法支持忽略已声明变量,推导部分变量,导致代码误导用户,不要这样书写代码,如下:
var intVal int

intVal :=1 //这时候会产生编译错误
intVal,intVal1 := 1,2 // 此时不会产生编译错误,因为有声明新的变量
  1. 简略语法只能在局部变量使用,全局变量使用会报错,编译错误信息如下:
non-declaration statement outside function body

变量使用

  • 变量可通过变量名进行取值和赋值等操作,例如:
a = 1
fmt.Printf("%d\n", a)

特殊变量

匿名变量

  • 作用:屏蔽掉函数相应返回值,并且不能被使用。
  • 写法:_
_, _, a := test()

常量

  • 常量是一种特殊的变量,限制变量为只读,值定义后不能更改。
  • 从功能角度看,常量是编译器实现的保证变量值不被修改的机制。

普通用法

声明定义
  • 常量的声明定义方式和变量是类似的,变量的声明定义方式常量都能使用,不同点如下:
  1. 常量使用const,变量使用var。
  2. 常用不支持变量自动推导的简单模式,因为不加const,自动推导无法判断是变量还是常量。
  • 常量的值需要在声明时一同定义,如果未定义会报错,如下:
const a int //编译错误 
使用
  • 常量只能取值,不能赋值。
const a = 1
fmt.Printf("%d\n", a)

特殊用法

  • go语言未定义额外的关键词来表示枚举,采用const来定义枚举类型。
  • 定义枚举时,常量值可以不定义,如下:
const {
    a = 1 + 1 
    b       //编译正常
    c       //编译正常
}
  • 常量值未定义时,常量的值为上一个已定义常量值的表达式;因此:
  1. 上一个例子中b和c都等于 1 + 1。
  2. 若a的值未给出,则编译报错,值未定义。

iota 常量计数器

  • iota:每个作用域独立的常量计数器。
  • iota 既可以在常量普通用法中使用,也可以在常量表示枚举时使用;但是在普通常量定义中使用和表示枚举时使用规则不一致,一般只使用在表示枚举时。
  1. 普通使用,定义常量
const b int = 1
const c int = iota
fmt.Println(b, c)
* 结果:1 0
* 结论:第一个声明的常量所在的行,iota 将会被置为 0,然后在每一个有常量声明时加一。
  1. 特殊使用,定义枚举
const (
        a = 1
        b = iota
)
fmt.Println(a, b)
* 结果:1 1
* 结论:任意行使用到iota,则第一行 iota 将会被置为 0,然后每一行加一。
  • 注意:枚举类型中,iota是每行加一,下面的例子容易出错。
const (
    AA, BB = iota + 1, iota + 2
    CC, DD
)
* AA,BB 的值为:0 + 1, 0 + 2;CC, DD 的值为: 1 + 1, 1 + 2

常量限制

  • 由于常量的限制作用是编译器实现的,编译器只能处理基础数据类型,因此常量的值仅支持基础类型,例如:字符串,字符,整型,浮点,布尔。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值