基础入门

命令行参数

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:根据传入的类型分配一片内存空间并返回指向这片内存空间的指针

参考

Golang修养之路

Go 语言设计与实现

posted @ 2024-01-23 20:46  及第  阅读(2)  评论(0编辑  收藏  举报