Go基础语法学习

for range语法糖

for range 的通用格式如下:

1
2
3
4
for index, value := range collection {
// 循环体
}

  • **index**:当前元素的索引(数组、切片、字符串、map 的键)或迭代计数(通道不适用)。
  • **value**:当前元素的值副本。
  • **collection**:支持遍历的数据类型,如数组、切片、字符串、map、通道(channel)。

go的接口

就是定义了一堆方法或者功能,如果某个定义的结构体类型实现了所有声明的方法,就称为该接口的一种实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import "fmt"

type Animal interface {
Speak() string
}

type Wise interface {
Think() string
}

type Dog struct {
Name string
}

func (d *Dog) Speak() string {
return "汪汪汪"
}
func (d *Dog) Think() string {
return "吃饭"
}

func main() {
wangcai := &Dog{"旺财"}
fmt.Println(wangcai.Speak())
fmt.Println(wangcai.Think())
}

当一个接口里有其他接口的时候,就类似继承,这个接口也包含了另一个接口的方法

当接口作为函数形参的时候,调用这个函数需要传入这个接口的具体实现

空接口因为没有定义任何方法,所以任何一个类型都是空接口的实现

1
2
3
4
5
6
7
8
func getValue(a interface{}) {
fmt.Println(a)
}

func main() {
b := 100
getValue(b)
}

go的defer

defer就像是一个栈,遵循先进后出的原则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func a(){
fmt.Println("a")
}

func b(){
fmt.Println("b")
}

func c(){
fmt.Println("c")
}

func main() {
defer a()
defer b()
defer c()
}
//输出c,b,a

defer的使用场景

资源释放:比如当打开文件,或者网络连接等,可以在打开后直接defer一个close函数,保证函数结束的时候资源也会被释放

和recover,panic执行try,catch功能

defer和return

重点:defer定义的延迟函数的参数在defer定义的时候就已经被确定了

go里的return本质是:定义返回值→执行defer→将结果返回

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png


Go基础语法学习
http://example.com/2023/12/19/Go基础语法学习/
作者
WoodQ
发布于
2023年12月19日
许可协议