《Shell 转 Go》
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

01. 变量声明

变量声明

Shell 声明变量

在 Shell 中, 变量声明通常有两种方式

  1. 通过 declare 进行变量声明, 并赋值。
  2. 省略 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 声明变量

在 Go 中, 也有两种方式

  1. 通过 var 关键字定义, 这种方式可以在 任意位置 定义变量。
  2. 省略 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 语言数字还分 有无符号各种长度, 之间也是不能互相通用的。

  1. int, int8, int16, int32, int64
  2. 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 设置常量

在 Shell 中, 使用 readonly 关键字来声明常量

readonly abc=100

readonly abc=1000
# bash: abc: readonly variable

Go 设置常量

在 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 之后, 组内的的常量值会依次递增。

  1. 可以通过 _ 占位符, 顺序递增
  2. 可以使用 iota+n 实现 跳值

总结

除了 弱类型和强类型 之外, 其他大部分使用方式都差不多。