1 Go 基础语法
1.1 变量声明
- 方法一:
var name (datatype)= value自动识别变量的类型,也可以显式得写出变量的类型
- 方法二:
name := value
- 常量:
const name (datetype= value
1.2 if else
- if 后的判断语句没有括号
- 判断后的运行函数必须有大括号,不能写到一行
1.3 循环
- Golang中只有for循环
- 存在
continue、break
1.4 Switch分支结构
- Golang中的
swtich非常强大 - 在
switch中执行过的case后,下面的case不会再被执行 - 可以使用swtich代替if/else,因为switch后可以不带值
1.5 数组
- 带有编号,长度固定
1.6 切片
- 可变长度
- 原理为:长度(已存入元素的数量)、容量(可以存放多少元素)、指向数组的指针
- 支持切片
1.7 Map
map[String]int指的是[key]value- ok作为检验Map是否存在该key的检验值,bool型
- map创建方式:
m := make(map[string]string),m := make(map[string]string, 10),m := map[string]string{ "a": "A", "b": "B", "c": "C", }
1.8 range
- 对于slice,Map 使用range实现快速遍历
使用场景:
- 迭代数组和切片
,对数组或切片使用
range时,它会返回两个值:索引和元素的副本。索引从0开始,直到集合的末尾。
s := []int{2, 3, 4, 5}
for index, value := range s {
fmt.Printf("index: %d, value: %d\n", index, value)
}
如果你不需要索引,可以使用下划线(_)忽略它:
for _, value := range s {
fmt.Println(value)
}
- 迭代字符串
对字符串使用
range会返回每个字符的索引和该字符的值(以rune的形式,即int32类型,可以表示任何Unicode字符)。
str := "hello"
for index, char := range str {
fmt.Printf("index: %d, char: %c\n", index, char)
}
- 迭代映射
对于映射(map),
range返回两个值:键和对应的值。注意,迭代映射时,返回的键的顺序是不确定的,因为映射是无序的。
m := map[string]int{"apple": 1, "banana": 2}
for key, value := range m {
fmt.Printf("key: %s, value: %d\n", key, value)
}
同样,如果你不需要键,可以使用下划线忽略它:
for _, value := range m {
fmt.Println(value)
}
1.9 函数
在Go语言中,一个标准的函数(func)头部包含以下几个部分:
-
关键字
func:标识这是一个函数定义的开始。 -
函数名:你自定义的函数名称,必须以字母或下划线开头,后续可以是任意数量的字母、数字或下划线。
-
参数列表(Parameters):
- 圆括号
()内定义函数的参数。 - 参数可以有名字和类型,也可以只有类型。
- 参数列表可以为空,表示函数不接受任何参数。
- 圆括号
-
结果列表(Results):
- 圆括号
()内定义函数返回的值。 - 可以返回一个或多个值,包括它们的类型。
- 如果函数不返回任何值,结果列表可以省略。
- 圆括号
-
接收者(Receiver):对于方法(Method)来说,这是可选的。它定义了方法所属的结构体类型,以及一个值接收者或指针接收者。结构体方法类似于成语方法 一个标准的函数头部示例如下:
func functionName(parameter1 type1, parameter2 type2) (result1 type1, result2 type2) {
// 函数体
}
对于方法,头部可能包含接收者:
func (receiverType receiverName) methodName(parameter1 type1, parameter2 type2) (result1 type1, result2 type2) {
// 方法体
}
1.10 指针
-
&:这个符号用于获取变量的内存地址,即取地址操作。例如,&n表示变量n的内存地址。 -
*:这个符号有两个用途:- 当用于声明变量时,它表示该变量是一个指针类型。例如,
*int表示一个指向整数类型的指针。 - 当用于指针类型的变量前面时,它表示访问指针所指向的内存地址中的值,即解引用操作。
- 当用于声明变量时,它表示该变量是一个指针类型。例如,
1.11 结构体
结构体通过struct关键字定义,可以指定字段(fields)的名称和类型。如果字段名以大写字母开头,那么它是公开的(exported),可以在包外访问;如果以小写字母开头,则是私有的(unexported),只能在定义它的包内访问。
go
type Person struct {
Name string
Age int
IsAdmin bool
}
创建结构体实例 结构体实例可以通过两种方式创建:
-
直接初始化:
p := Person{Name: "Alice", Age: 30, IsAdmin: true} -
使用
new函数:p := new(Person)这种方式会分配内存并返回指向新分配的
Person类型零值的指针。
访问和修改字段 可以通过点(.)操作符来访问和修改结构体的字段:
p.Name = "Bob"
fmt.Println(p.Age) // 输出: 30
使用结构体字面量
结构体字面量是一种创建结构体实例的简洁方式,特别是在初始化时:
p := Person{Name: "Alice", Age: 30}
如果字段名以大写字母开头,它们必须按顺序出现。如果字段名以小写字母开头(私有字段),则可以省略字段名:
p := Person{"Alice", 30} // 只有公开字段需要指定
匿名字段
结构体可以包含匿名字段,这意味着字段名可以省略,类型直接作为字段名:
type User struct {
Person // 匿名字段
积分 int
}
u := User{Person{"Alice", 30}, 100}
匿名字段允许结构体嵌入其他类型,这样可以继承嵌入类型的字段和方法。
方法和接收者
可以为结构体定义方法,方法是与结构体关联的函数。方法可以有接收者(receiver),接收者可以是值类型或指针类型:
func (p *Person) Greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}
p := Person{Name: "Alice"}
p.Greet() // 输出: Hello, my name is Alice
在这个例子中,Greet 方法有一个名为p的指针类型接收者。
结构体组合
结构体可以包含其他结构体作为字段,这种组合方式可以用来构建复杂的数据结构:
type Address struct {
City string
Country string
}
type Employee struct {
Person
Address
JobTitle string
}
e := Employee{
Person: Person{Name: "Alice", Age: 30},
Address: Address{City: "New York", Country: "USA"},
JobTitle: "Engineer",
}
1.12 错误处理
- 在函数传参处加入 err error
return nil, errors.New("not found")- 执行函数后先判断err是否为nil
1.13 字符串操作
-
标准库Strings
-
字符串格式化打印
1.14 JSON处理
- 一个结构体的公开字段首字母为大写,就可用
josn.Marshall处理
1.15 数字解析
- 使用
strconv包