0%

golang 命名返回值

返回值是一种声明

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package main

import "fmt"

type TestModel struct {
Name string
Age int
}

/*
golang 在返回值中声明返回对象需要注意的点,实际上和var声明是一样的
*/

// 返回值声明就是相当于使用var申明了,这在map和指针的情况下回产生空指针异常。
// 请理解一下空指针取址能取到,这其实很简单。
// 指针对象指的是这个符号的内存存的是指针,空指针是说他的内存存的内存是nil。
// 而这个对象肯定是有一个内存地址来保存它的,想想吧,任意一个能看见的编码符号,都是有地址在存储的。
func test1() (
model TestModel, modelPtr, testModel *TestModel, modelList []TestModel, modelPtrList []*TestModel,
modelListPtr *[]TestModel, mapData map[string]bool) {
// 能取址说明是有地址的

fmt.Println(&model, model)
fmt.Println(&modelPtr, modelPtr)
fmt.Println(&modelList, modelList)
fmt.Println(&modelPtrList, modelPtrList)
// 空指针
fmt.Println(&modelListPtr, modelListPtr)
fmt.Println(&mapData, mapData)

// map 是空的如果要使用,需要先make: mapData = make(map[string]bool)注意不是 ":="
//list := []string{"abc", "def"}
//for _, data := range list {
// mapData[data] = true
//}

// 其实和上面一样
//var modelListIn []TestModel
//var modelPtrListIn []*TestModel
//var modelListPtrIn *[]TestModel
//fmt.Println(&modelListIn)
//fmt.Println(&modelPtrListIn)
//fmt.Println(modelListPtrIn)

// list 可以直接用
//var list []string
//list = append(list, "abc")
//fmt.Println(list)
return
}

func main() {
test1()
}

返回值和defer使用

defer定义的方法会在return后被执行

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main

import "fmt"

func DeferFunc1(i int) (t int) {
t = i
defer func() {
t += 3
}()
return
}

func DeferFunc2(i int) int {
t := i
defer func() {
t += 3
}()
return t
}

func DeferFunc3(i int) (t int) {
defer func() {
t += i
}()
return 2
}


func main() {
fmt.Println(DeferFunc1(1))
fmt.Println(DeferFunc2(1))
fmt.Println(DeferFunc3(1))
}

/*
答案
4
1
3
分析
1. 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值
2. 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返回

DeferFunc1 :
t:= 0
t = 1
t +=3 -> t = 4

DeferFunc3:
t:=0
t = 2
t += 1 -> t = 3
*/