Go入门-函数

1.函数声明
每个函数声明包含一个名字、一个形参列表、一个可选的返回列表及函数体

1
2
3
func hebing(x, y []int) []int {
return append(x, y[:]...)
}

上面函数的作用是合并两个整型的切片
2.递归、延迟函数、变长函数

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
package main

import (
"fmt"
"golang.org/x/net/html"
"net/http"
"os"
)

func main() {
resp, err := http.Get("http://www.baidu.com")
checkError(err)
//延迟关闭
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
resp.Body.Close()
fmt.Printf("Http is not 200!")
}
//f, err := os.Open("C:\\Users\\ztrk\\Desktop\\product\\index.html")
//checkError(err)
////延迟关闭
//defer f.Close()
doc, err := html.Parse(resp.Body)
checkError(err)
m := make(map[string]int)
Count(m, doc)
fmt.Println(m)
}

func Count(m map[string]int, n *html.Node) map[string]int {
if n.Type == html.ElementNode {
m[n.Data]++
}
for i := n.FirstChild; i != nil; i = i.NextSibling {
//循环调用
Count(m, i)
}
return m
}

//错误检查函数
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Error...:%s", err)
os.Exit(1)
}
}

输出:
map[span:5 title:1 script:13 noscript:1 map:1 area:1 a:32 ul:1 form:1 i:3 p:3 html:1 meta:4 link:11 body:1 img:4 b:2 head:1 style:4 div:21 input:14 li:4]
运行前需要先安装golang.org/x/net/html包,先从github上clone,再go install golang.org/x/net/html,注意目录结构一定相同
上面函数的作用是统计在一个html中每个节点类型的数量,最后输出的是一个map
函数Count是一个递归调用,Count调用它自己
在main函数中defer定义延迟处理,延迟处理不会立即执行,总会执行,在函数结束前执行,多用在文件、流关闭等。
使用时要谨慎,例如:如果打开很多文件时,在函数还没结束前,没有执行延迟处理时,打开的文件有可能占满了内存,来不及关闭文件程序面临崩溃了。
变长函数,就是可以接收不定数量变量的函数,fmt.Println()就是一个变长函数
定义一个变长函数

1
2
3
4
func ftest(a string, b ...string) string {
fmt.Println(b)
return a
}

b实际就是一个string类型切片
注意:变长函数只能是最后一个变量
3.匿名函数和闭包
匿名函数1

1
2
f := func(a int, b int) int { return a + b }
println(f(1, 2))

匿名函数2

1
2
3
4
//直接创建并执行
func(a int, b int) int {
return a * b
}(3, 4)

后面括号中是传值
闭包

1
2
3
4
5
6
7
8
9
10
11
func main(){
F := Test()
fmt.Println(F(3))
}
func Test() func(int) int {
a := 1
b := 2
return func(c int) int {
return a + b + c
}
}

4.错误处理
上面的checkError()函数是用来处理错误的,打印错误,并以错误状态1退出
比较常见是打开文件或者访问URL等操作,函数会返回一个处理之后的数据和一个error类型,在主函数中判断error返回值

坚持原创技术分享,您的支持将鼓励我继续创作!