命令行参数
func main() {
fmt.Println(strings.Join(os.Args[1:], " "))
}
os.Args变量是一个字符串(string)的切片(slice),os.Args的第一个元素:os.Args[0],是命令本身的名字;其它的元素则是程序启动时传给它的参数。
类型和数据结构
Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。
基础数据结构
- 整型:int8、int16、int32、int64四种有符号整数类型和uint8、uint16、uint32、uint64四种无符号整数类型(uintptr:无符号整型,用于存放一个指针;rune:int32等价类型,方便进行字符操作)
- 浮点数:float32和float64
- 复数:complex64和complex128
- 布尔型:true和false
- 字符串
字符串常用操作
字符串是由字符组成的数组,C 语言中的字符串使用字符数组char[]
表示。在运行时都会使用reflect.StringHeader
表示。
type StringHeader struct {
Data uintptr // 指向字节数组的指针
Len int // 数组的大小
}
可以读取字符串内容,如fmt.Sprintf("%c", s[1])
,但是不能像s[1] = a
这样修改字符串。
标准库中有四个包对字符串处理尤为重要:bytes、strings、strconv和unicode包。
- strings包提供了如字符串的查询、替换、比较、截断、拆分和合并等功能函数
- bytes包针对[]byte类型提供了很多类似strings的功能函数
- strconv包提供了布尔型、整型数、浮点数和对应字符串的相互转换
- unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等功能
整型转字符串
x := 123
y := fmt.Sprintf("%d", x)
z := strconv.Itoa(x)
字符串转整型
x, err := strconv.Atoi("123")
y, err := strconv.ParseInt("123", 10, 64)
复合数据类型
- 数组:由固定长度的特定类型元素组成的序列
- 切片:变长序列,在运行时切片可以由如下的
reflect.SliceHeader
结构体表示
type SliceHeader struct {
Data uintptr // 指向数组的指针
Len int // 当前切片的长度
Cap int // 当前切片的长度
}
- Map:key/value哈希表
- 结构体:由零个或多个任意类型的值聚合成的实体
常用关键字
defer
defer关键字传入的函数会在函数返回之前运行,底层是一个后进先出的栈。Go1.14引入了开放编码方式实现defer,编译器会将defer函数直接在当前函数内展开,并在返回语句的末尾判断是否执行defer调用。开放编码方式尽量在栈上而不是堆上分配内存空间,可以有效避免运行时内存损耗。
make和new
make:初始化内置的数据结构(切片、哈希表和 Channel)
new:根据传入的类型分配一片内存空间并返回指向这片内存空间的指针