后端模块一 - ChapterⅠ Go基础语法

74 阅读5分钟

1 Go 基础语法

1.1 变量声明

  1. 方法一: var name (datatype)= value 自动识别变量的类型,也可以显式得写出变量的类型

image.png

  1. 方法二:name := value

image.png

  1. 常量:const name (datetype= value

image.png

1.2 if else

  1. if 后的判断语句没有括号
  2. 判断后的运行函数必须有大括号,不能写到一行

image.png

1.3 循环

  1. Golang中只有for循环
  2. 存在continue、break

image.png

1.4 Switch分支结构

  1. Golang中的swtich非常强大
  2. switch中执行过的case后,下面的case不会再被执行
  3. 可以使用swtich代替if/else,因为switch后可以不带值

image.png

1.5 数组

  1. 带有编号,长度固定

image.png

1.6 切片

  1. 可变长度
  2. 原理为:长度(已存入元素的数量)、容量(可以存放多少元素)、指向数组的指针
  3. 支持切片

image.png

1.7 Map

  1. map[String]int指的是[key]value
  2. ok作为检验Map是否存在该key的检验值,bool型
  3. map创建方式:m := make(map[string]string)m := make(map[string]string, 10)m := map[string]string{ "a": "A", "b": "B", "c": "C", } image.png

1.8 range

  1. 对于slice,Map 使用range实现快速遍历 image.png 使用场景:
  • 迭代数组和切片 ,对数组或切片使用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)头部包含以下几个部分:

  1. 关键字 func:标识这是一个函数定义的开始。

  2. 函数名:你自定义的函数名称,必须以字母或下划线开头,后续可以是任意数量的字母、数字或下划线。

  3. 参数列表(Parameters):

    • 圆括号()内定义函数的参数。
    • 参数可以有名字和类型,也可以只有类型。
    • 参数列表可以为空,表示函数不接受任何参数。
  4. 结果列表(Results):

    • 圆括号()内定义函数返回的值。
    • 可以返回一个或多个值,包括它们的类型。
    • 如果函数不返回任何值,结果列表可以省略。
  5. 接收者(Receiver):对于方法(Method)来说,这是可选的。它定义了方法所属的结构体类型,以及一个值接收者或指针接收者。结构体方法类似于成语方法 一个标准的函数头部示例如下:

func functionName(parameter1 type1, parameter2 type2) (result1 type1, result2 type2) {
    // 函数体
}

对于方法,头部可能包含接收者:

func (receiverType receiverName) methodName(parameter1 type1, parameter2 type2) (result1 type1, result2 type2) {
    // 方法体
}

image.png

1.10 指针

  1. &:这个符号用于获取变量的内存地址,即取地址操作。例如,&n表示变量n的内存地址。

  2. *:这个符号有两个用途:

    • 当用于声明变量时,它表示该变量是一个指针类型。例如,*int表示一个指向整数类型的指针。
    • 当用于指针类型的变量前面时,它表示访问指针所指向的内存地址中的值,即解引用操作。

1.11 结构体

结构体通过struct关键字定义,可以指定字段(fields)的名称和类型。如果字段名以大写字母开头,那么它是公开的(exported),可以在包外访问;如果以小写字母开头,则是私有的(unexported),只能在定义它的包内访问。

go
type Person struct {
    Name    string
    Age     int
    IsAdmin bool
}

创建结构体实例 结构体实例可以通过两种方式创建:

  1. 直接初始化

    p := Person{Name: "Alice", Age: 30, IsAdmin: true}
    
  2. 使用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 错误处理

  1. 在函数传参处加入 err error
  2. return nil, errors.New("not found")
  3. 执行函数后先判断err是否为nil image.png

1.13 字符串操作

  1. 标准库Strings image.png

  2. 字符串格式化打印 image.png

1.14 JSON处理

  1. 一个结构体的公开字段首字母为大写,就可用josn.Marshall处理

image.png

1.15 数字解析

  1. 使用strconvimage.png

1.16 进程信息

image.png