这是我参与「第五届青训营 」伴学笔记创作活动的第1天,今天主要对go语言的基本语法和基本数据结构进行了学习。
1. 本堂课重点内容
- go语言开发环境
- go语言基础语法
- 标准库
2. 详细知识点
2.1 go程序基本结构
一个go语言程序主要会包括以下几个部分:
- 包声明
- 引入包
- 函数
- 变量
- 语句 & 表达式
- 注释
以一个简单的helloworld程序为例,我们可以清晰的感知到这种结构
package main //包声明
import "fmt" //引入包
//函数
func main() {
fmt.Println("Hello, World!") // 语句 & 表达式
}
2.2 go语言基本语法
变量和常量
变量的声明结构:var name type。type有时可以省略。
常量是一个简单值的标识符,程序运行时不会被修改,类型只能是是布尔型、数字型和字符串型。
var a = "initial"
var b, c int = 1, 2
d := a + "foo"
const e = true
判断语句
go语言可以使用if else或者switch来进行判断
- if else
if else的使用相较于c或c++,不需要对判断条件使用括号包围
if a == 1 {
fmt.Println("a == 1")
}
else {
fmt.Println("a != 1")
}
- switch
switch的使用相较于C或c++, 则有很大的不同。一方面,每个case执行完毕后,不需要手动添加break来结束switch(也可以使用fallthrough强制执行后一条语句且不判断true);另一方面,其也不局限于简单的判断表达式的值,只需要每个case条件的为相同类型的表达式。
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
default :
fmt.Println("not one or two")
}
switch {
case a==1:
fmt.Println("one")
case a==2:
fmt.Println("two")
default:
fmt.Println("not one or two")
}
循环语句
go只有for一种循环,使用方法与c的for循环类似,省略三个语句中部分语句可实现while循环的效果。在循环中也可以使用continue和break对循环过程进行控制。
for i := 1; i < 4; i++ {
fmt.Println(i)
if(i==3)
break;
}
for i <= 3 {
i++;
}
2.3 内置数据结构
数组
go语言中的数组长度一经声明就长度固定不变
var a [5]int
a[1] = 1
var b [3][4] int
b[1][2] = 2
切片
切片可以理解为一个可变长度的数组,使用make创建,使用append在其末尾添加元素,也可以使用python的切片操作对其进行切分。
s := make([]string, 3)
s[0] = "a"
s = append(s, "d")
map
map的使用类似于python的字典或者c++的unordered_map,其内部是无序的。
m := make(map[string]int)
m["one"] = 1
a := m["one"]
delete(m, "one")
3. 其他
3.1 string长度之谜
a := "initial"
fmt.Println(len(a)) // 7
fmt.Println(unsafe.Sizeof(a)) // 16
通过上面的案例我们可以看出len函数可以得到string的长度为7,而unsafe.Sizeof得到的结果却是16,与7没有什么关系。这是因为string类型对应一个结构体,结构体声明如下:
type StringHeader struct {
Data uintptr
Len int
}
在64位系统上uintptr和int都是8字节,加起来就16了。