Skip to content

Commit 892a277

Browse files
committed
update lesson8
1 parent a14fc5e commit 892a277

File tree

3 files changed

+184
-2
lines changed

3 files changed

+184
-2
lines changed

workspace/lesson8/func_advance.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import "fmt"
4+
import "math"
5+
6+
// define function getSquareRoot1
7+
func getSquareRoot1(x float64) float64 {
8+
return math.Sqrt(x)
9+
}
10+
11+
// deffine a function variable
12+
var getSquareRoot2 = func(x float64) float64 {
13+
return math.Sqrt(x)
14+
}
15+
16+
// define a function type
17+
type callback_func func(int) int
18+
19+
20+
func calValue(x int, cb callback_func) int{
21+
fmt.Println("[func|calValue]")
22+
return cb(x)
23+
}
24+
25+
func realFunc(x int) int {
26+
fmt.Println("[func|realFunc]callback function")
27+
return x*x
28+
}
29+
30+
func main() {
31+
num := 100.00
32+
result1 := getSquareRoot1(num)
33+
result2 := getSquareRoot2(num)
34+
fmt.Println("result1=", result1)
35+
fmt.Println("result2=", result2)
36+
37+
value := 81
38+
result3 := calValue(value, realFunc)
39+
fmt.Println("result3=", result3)
40+
}

workspace/lesson8/method.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import "fmt"
4+
5+
type Circle struct {
6+
radius float64
7+
}
8+
9+
func (c Circle) getArea() float64 {
10+
return 3.14 * c.radius * c.radius
11+
}
12+
13+
func (c Circle) changeRadius(radius float64) {
14+
c.radius = radius
15+
}
16+
17+
func (c *Circle) changeRadius2(radius float64) {
18+
c.radius = radius
19+
}
20+
21+
func (c Circle) addRadius(x float64) float64{
22+
return c.radius + x
23+
}
24+
25+
func main() {
26+
var c Circle
27+
c.radius = 10
28+
fmt.Println("radius=", c.radius, "area=", c.getArea())
29+
30+
c.changeRadius(20)
31+
fmt.Println("radius=", c.radius, "area=", c.getArea())
32+
33+
c.changeRadius2(20)
34+
fmt.Println("radius=", c.radius, "area=", c.getArea())
35+
36+
result := c.addRadius(3.6)
37+
fmt.Println("radius=", c.radius, "result=", result)
38+
}

workspace/lesson8/readme.md

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,110 @@
145145

146146
* 函数高级用法
147147

148-
* 函数作为另一个函数的实参:函数定义后可以作为另一个函数的实参
148+
* 函数作为其它函数的实参:函数定义后可以作为另一个函数的实参,比如下例的函数realFunc作为函数calValue的实参
149+
150+
```go
151+
package main
152+
153+
import "fmt"
154+
import "math"
155+
156+
// define function getSquareRoot1
157+
func getSquareRoot1(x float64) float64 {
158+
return math.Sqrt(x)
159+
}
160+
161+
// deffine a function variable
162+
var getSquareRoot2 = func(x float64) float64 {
163+
return math.Sqrt(x)
164+
}
165+
166+
// define a function type
167+
type callback_func func(int) int
168+
169+
170+
// function calValue accepts a function variable cb as its second argument
171+
func calValue(x int, cb callback_func) int{
172+
fmt.Println("[func|calValue]")
173+
return cb(x)
174+
}
175+
176+
func realFunc(x int) int {
177+
fmt.Println("[func|realFunc]callback function")
178+
return x*x
179+
}
180+
181+
func main() {
182+
num := 100.00
183+
result1 := getSquareRoot1(num)
184+
result2 := getSquareRoot2(num)
185+
fmt.Println("result1=", result1)
186+
fmt.Println("result2=", result2)
187+
188+
value := 81
189+
result3 := calValue(value, realFunc) // use function realFunc as argument of calValue
190+
fmt.Println("result3=", result3)
191+
}
192+
```
193+
149194
* 闭包
150-
* 方法
195+
196+
* 方法:类似C++ class里的方法,只是go没有class的概念。
197+
198+
* 定义:function_name是类型var_data_type的实例的方法
199+
200+
```go
201+
func (var_name var_data_type) function_name([parameter_list])[return type] {
202+
do sth
203+
}
204+
```
205+
206+
207+
208+
* 示例:getArea是Circle的方法,Circle的实例可以调用该方法
209+
210+
```go
211+
package main
212+
213+
import "fmt"
214+
215+
type Circle struct {
216+
radius float64
217+
}
218+
219+
func (c Circle) getArea() float64 {
220+
return 3.14 * c.radius * c.radius
221+
}
222+
223+
/*
224+
changeRadius和changeRadius2的区别是后者可以改变变量c的成员radius的值,前者不能改变
225+
*/
226+
func (c Circle) changeRadius(radius float64) {
227+
c.radius = radius
228+
}
229+
230+
func (c *Circle) changeRadius2(radius float64) {
231+
c.radius = radius
232+
}
233+
234+
func (c Circle) addRadius(x float64) float64{
235+
return c.radius + x
236+
}
237+
238+
func main() {
239+
var c Circle
240+
c.radius = 10
241+
fmt.Println("radius=", c.radius, "area=", c.getArea()) //10, 314
242+
243+
c.changeRadius(20)
244+
fmt.Println("radius=", c.radius, "area=", c.getArea()) //10, 314
245+
246+
c.changeRadius2(20)
247+
fmt.Println("radius=", c.radius, "area=", c.getArea()) //20, 1256
248+
249+
result := c.addRadius(3.6)
250+
fmt.Println("radius=", c.radius, "result=", result) // 20, 23.6
251+
}
252+
```
253+
254+

0 commit comments

Comments
 (0)