Skip to content

Commit c26e9ec

Browse files
committed
update function doc
1 parent 700c5ed commit c26e9ec

File tree

3 files changed

+103
-42
lines changed

3 files changed

+103
-42
lines changed

workspace/lesson8/func2.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// func2.go
2+
package main
3+
4+
import "fmt"
5+
6+
/*
7+
函数add的返回值有2个,类型是int,标识符分别是c和d
8+
可以在函数体内直接给c和d赋值,return后面可以带,也可以不带返回值
9+
*/
10+
func addAndSub(a int, b int) (c int, d int) {
11+
c = a + b
12+
d = a - b
13+
return // 这一行写为 return c, d 也可以
14+
}
15+
16+
func main() {
17+
a1, b1 := 1, 2
18+
c1, d1 := addAndSub(a1, b1)
19+
/*输出结果是:3 -1*/
20+
fmt.Println(c1, d1)
21+
}

workspace/lesson8/func3.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// func3.go
2+
package main
3+
4+
import "fmt"
5+
6+
func main() {
7+
/*
8+
定义2个匿名函数,也就是闭包。
9+
闭包可以直接调用,也可以赋值给一个变量,后续调用
10+
*/
11+
result1 := func(a int, b int) int {
12+
return a + b
13+
}(1, 2)
14+
15+
var sub = func(a int, b int) int {
16+
return a - b
17+
}
18+
result2 := sub(1, 2)
19+
/*输出结果:3 -1*/
20+
fmt.Println(result1, result2)
21+
}

workspace/lesson8/readme.md

Lines changed: 61 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -57,51 +57,37 @@
5757
}
5858
```
5959

60-
61-
62-
* 函数参数
63-
64-
* 值传递:和C++里的传值一样,参加下例里的swap
60+
* 给返回值命名
6561

6662
```go
63+
// func2.go
6764
package main
6865
66+
import "fmt"
6967
70-
func add(a, b int, c, d string) (int, string) {
71-
return a+b, c+d
72-
}
73-
74-
func swap(a int, b int) {
75-
println("[func|swap]a=", a, "b=", b)
76-
a, b = b, a
77-
println("[func|swap]a=", a, "b=", b)
78-
}
79-
80-
func swapRef(pa *int, pb *int) {
81-
println("[func|swapRef]a=", *pa, "b=", *pb)
82-
var temp = *pa
83-
*pa = *pb
84-
*pb = temp
85-
println("[func|swapRef]a=", *pa, "b=", *pb)
68+
/*
69+
函数add的返回值有2个,类型是int,标识符分别是c和d
70+
可以在函数体内直接给c和d赋值,return后面可以带,也可以不带返回值
71+
*/
72+
func addAndSub(a int, b int) (c int, d int) {
73+
c = a + b
74+
d = a - b
75+
return // 这一行写为 return c, d 也可以
8676
}
8777
8878
func main() {
89-
a, b := 1, 2
90-
c, d := "c", "d"
91-
res1, res2 := add(a, b, c, d)
92-
println("res1=", res1, "res2=", res2)
93-
94-
println("[func|main]a=", a, "b=", b)
95-
swap(a, b)
96-
println("[func|main]a=", a, "b=", b)
97-
98-
println("[func|main]a=", a, "b=", b)
99-
swapRef(&a, &b)
100-
println("[func|main]a=", a, "b=", b)
79+
a1, b1 := 1, 2
80+
c1, d1 := addAndSub(a1, b1)
81+
/*输出结果是:3 -1*/
82+
fmt.Println(c1, d1)
10183
}
10284
```
85+
86+
10387

104-
* 引用传递:和 C++里的传指针一样,参见下例里的swapRef
88+
* 函数参数传递
89+
90+
* **Go里的函数传参只有值传递这一种方式**:和C++里的传值一样,参加下例里的swap
10591

10692
```go
10793
package main
@@ -141,8 +127,15 @@
141127
}
142128
```
143129

144-
130+
虽然swap函数无法改变外部实参的值,swapRef函数可以改变外部实参的值,但是swap和swapRef函数其实都是值传递,细节区别是:
145131

132+
* swap是直接把变量a和b的值拷贝一份给形参
133+
* swapRef是把变量a和b的地址拷贝一份给形参
134+
135+
所以,要清楚这2个其实都是值传递,Go里的函数传参也只有值传递这一种方式,并没有像C++那样的引用变量和引用传递。
136+
137+
后续学习了Go里的map等变量类型,可以参考这篇文章[Go有引用变量和引用传递么?](../problem/p3)
138+
146139
* 函数高级用法
147140

148141
* 函数作为其它函数的实参:函数定义后可以作为另一个函数的实参,比如下例的函数realFunc作为函数calValue的实参
@@ -191,22 +184,48 @@
191184
}
192185
```
193186

194-
* 闭包
187+
* 闭包:匿名函数。顾名思义就是没有函数名,参考下面的代码示例:
195188

189+
```go
190+
// func3.go
191+
package main
192+
193+
import "fmt"
194+
195+
func main() {
196+
/*
197+
定义2个匿名函数,也就是闭包。
198+
闭包可以直接调用,也可以赋值给一个变量,后续调用
199+
*/
200+
result1 := func(a int, b int) int {
201+
return a + b
202+
}(1, 2)
203+
204+
var sub = func(a int, b int) int {
205+
return a - b
206+
}
207+
result2 := sub(1, 2)
208+
/*输出结果:3 -1*/
209+
fmt.Println(result1, result2)
210+
}
211+
```
212+
213+
214+
196215
* 方法:类似C++ class里的方法,只是go没有class的概念。
197-
216+
198217
* 定义:function_name是类型var_data_type的实例的方法
199-
218+
200219
```go
201220
func (var_name var_data_type) function_name([parameter_list])[return type] {
202221
do sth
203222
}
204223
```
205-
224+
206225

207-
226+
208227
* 示例:getArea是Circle的方法,Circle的实例可以调用该方法
209-
228+
210229
```go
211230
package main
212231
@@ -250,5 +269,5 @@
250269
fmt.Println("radius=", c.radius, "result=", result) // 20, 23.6
251270
}
252271
```
253-
272+
254273

0 commit comments

Comments
 (0)