持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
变量
- 变量 用来表示没有固定值且可改变的数据(计算机角度:变量是用来存储数据的内存)
- 定义:使用关键字
var定义变量 :var x int,类型放在变量的后面。运行时会自动初始化零值。
var x int // 自动初始化为 0
var y = "hello" // 自动推动出变量 y 类型
// 一次定义多个变量
var x, y int // 相同类型初始化
var x,y = 1, "hello" // 不同类型初始化
// 使用组的方式进行多变量的定义
var (
x, y int
a, b = 1, "hello"
)
-
简短模式定义变量, 使用方式:
变量名 := 值。- 使用简短模式定义变量需要同时显示初始化
- 不提供数据类型,直接通过初始化的值推断出变量类型
- 仅使用在函数内部
func defineParams(){
x := 1
a, b := 1, "hello"
}
注意点:
var x = 100 // 全局变量
func main(){
println(&x, x) // 输出结果:00exl 100
x := 2 // 局部变量
println(&x, x) // 输出结果:0xc783272 2
}
func method1() {
y := 102
...
x,y := 22,993
}
- 全局变量和局部变量名相同
局部变量定义了和全局变量相同的变量名时对比内存地址,可以发现是不同的变量地址,说明局部变量重新定义了一个变量 x.在使用时都会用到此局部变量。开发时需要注意此操作。
- 同一个作用域下,有些变量可能不是定义变量,而是退化赋值,详细看以上代码的 method1.其中 变量`y是赋值而不是定义新变量。
- 在处理函数错误返回值时,退化赋值允许我们重复使用 err 变量
func method2(){
x,err := os.open("./files/test.txt")
...
buf := make([]byte,1024)
y,err := f.Read(buf)
}
- Golang 语法体系中,如果定义了变量却从未使用将会无法通过编译
命名
-
命名规范:
- 字母或下划线开始,由多个字母,数字和下划线组合
- 区分大小写(大小写还有个特性:大写类似public 属性,小写类似 private 属性)
- 使用驼峰命名规则
- 局部变量优先使用
- 不能使用关键字作为变量名
- 尽量不使用与预定义常量、类型、内置函数相同的名字
- 专有名词一般都会全部大写
-
空标识符
_用来表示忽略占位符,对一些无用的成员可使用 如x,_ := funcDeal()
常量
常量
- 常量表示运行时恒定不可改变的值,通常是一些字面量。在编译期是可确定的值。
- 不常使用的常量不会引起编译错误
- 显式指定常量类型,那么就需要保证常量值就是该类型
- 允许通过某些编译器计算出结果的表达式,作为常量值,如
unsafe.Sizeof、len、cap - 在常量组中若不指定类型和初始化值,那么都将和上一行的常量一样的类型和值
// 常量定义 x 值必须是int 类型
const x int = 1
const strSize = len("hello")
const (
x int = 120
y // 和 x 一样的类型和值
s ="abc"
z // 和 s 一样的类型和值
)
枚举
-
Go 中是没有 enum 定义,不过可以通过关键字 iota 实现一组自增量值实现枚举
-
支持多个 iota ,每组单独计数
-
中断自增,必须显示恢复,且后续将会自动继续递增
-
支持显式指定类型
const ( x = iota // 0 y // 1 z // 2 ) // 支持多个 iota ,每组单独计数 const ( x,a= iota, iota*10 // 0, 0*10 y,b // 1, 1*10 z,c // 2, 2*10 ) // 中断自增,必须显示恢复,且后续将会自动继续递增 const ( a = iota // 0 b // 1 c = 99 // 99 d // 99 和上一行一样 e = iota // 4 恢复iota 自增,包含 c,d ) // 显式指定类型,默认是int 类型 const ( a =iota // int 类型 b float32 = iota // float32 类型 c = iota // int 类型。不指定的话将会和 b一样 )枚举最佳实践
自定义一个类型作为枚举的类型,主要是为明确该枚举的用途
type color int const ( red color = iota blue black )常量和变量区别
- 变量是在运行期间分配存储内存,常量是编译器在预处理阶段直接使用
- 数字常量不会分配存储空间,无寻址地址