01. 变量声明
在 Shell 中, 变量声明通常有两种方式
- 通过
declare
进行变量声明, 并赋值。 - 省略
declare
进行变量声明。
# 方式1
declare abc="abc"
declare abc_123=123
# 方式2
abc="abc"
abc_123=123
事实上, declare
的用法还是很复杂的, 更多可以参考: https://www.runoob.com/linux/linux-comm-declare.html
在 Go 中, 也有两种方式
- 通过
var
关键字定义, 这种方式可以在 任意位置 定义变量。 - 省略
var
后, 可以使用:=
进行变量声明。 但是这种方式只能在 代码块 中使用, 可以简单的理解为 只能在函数中使用。
var abc int8 = 100 // 指定 abc 的类型是 int8
var def = 100 // 推定类型为 int
func demo() {
a1 := 100
var a2 = 100
fmt.Println(a1, a2)
}
有句笑话说: 动态类型一时爽, 重构全是火葬场
Shell 中, 变量是完完全全的 弱类型(动态类型)。 换句话说, 同一个变量名可以是 字符串, 也可以是 数字, 也可以是其他的。
abc="word" # 字符串
abc=123 # 数字
abc=(value1 value2) # 数组
而 Go 是一个完完全全的 强类型 语言。 如果变量声明时是 字符串, 那么绝对不能再重新被赋值为 数字。
func assignment() {
abc := "word"
abc = 123 // 报错: cannot use 123 (untyped int constant) as string value
fmt.Println(abc)
}
更有甚者, Go 语言数字还分 有无符号, 各种长度, 之间也是不能互相通用的。
int, int8, int16, int32, int64
uint, uint8, uint16, uint32, uint64
func assignmentNumber() {
var n int = 100
var n8 int8
n8 = n // cannot use n (variable of type int) as int8 value
fmt.Println(n8)
}
常量, 可以理解未 不可变 的变量, 也就是 只读。
在 Shell 中, 使用 readonly
关键字来声明常量
readonly abc=100
readonly abc=1000
# bash: abc: readonly variable
在 Go 中, 使用 const
关键字来声明常量。
const abc=100
// var abc=1000
初次之外, Go 语言中还有 iota
这种特殊的用法。
const (
Monday = 0
Tuesday = iota // 2
_ // 3。 周 3 跳过, 但使用站位符是 iota 递增
Thursday = iota // 4
// Friday
// Saturday
Sunday = iota + 2 // 7。 5和6不存在, 因此 Sunday 是 iota+2
)
使用 iota 之后, 组内的的常量值会依次递增。
- 可以通过
_
占位符, 顺序递增。 - 可以使用
iota+n
实现 跳值。
除了 弱类型和强类型 之外, 其他大部分使用方式都差不多。