13.函数 注意:有些时候我会省略main函数
1: func functionnanme([parametername type]) [returntype] {
2: //function body
3: } // 其中参数列表和返回值列表是可选
两个数相加
1: func add(a int, b int) int {
2: fmt.Println(a+b)
3: return 0
4: }
5: func main() {
6: add(2, 3)
7: }
多返回值
1: func calc(a, b int)(int, int) {
2: sum:=a+b
3: sub:=a-b
4: return sum,sub
5: }
6: func main() {
7: sum,sub:=calc(2,3)
8: fmt.Println(sum, sub)
9: }
换种写法
1: func calc(a, b int)(sum int, sub int) {
2: sum=a+b
3: sub=a-b
4: return
5: }
可变参数(可以传参数,可以不传,也可以传0个或多个参数)
1: func calc_v1(b ...int) int {
2: sum:=0
3: for i:=0;i<len(b);i++ {
4: sum = sum + b[i]
5: }
6: return sum
7: }
8: func main(){
9: sum:=calc_v1()
10: fmt.Printf("sum=%d\n", sum)
11: }
defer语句
1: func calc_v1(b ...int)(sum int, sub int) {
2: defer fmt.Println("defer")
3: return
4: }
几个例子:
1: func test_defer() {
2: defer fmt.Println("hello")
3: fmt.Println("alex")
4: }
输出结果
1: >>> alex
2: >>> hello
多个defer 遵循栈的特性:先进后出
1: func test_defer() {
2: defer fmt.Println("hello_1")
3: defer fmt.Println("hello_2")
4: defer fmt.Println("hello_3")
5: defer fmt.Println("hello_4")
6: }
输出结果
1: >>> hello_4
2: >>> hello_3
3: >>> hello_2
4: >>> hello_1
1: func test_defer_2() {
2: for i:=0;i<5;i++ {
3: fmt.Println("hello%d\n", i)
4: }
5: fmt.Println("start...\n")
6: }
打印结果
1: >>> start...
2: >>> hello,3
3: >>> hello,2
4: >>> hello,1
5: >>> hello,0
1: func test_defer_3() {
2: var i int =0
3: defer fmt.Printf("defer i=%d\n", i)
4: i = 1000
5: fmt.Printf("i=%d\n", i)
6: }
输出
1: >>> i=1000
2: >>> defer i=0
常用内置函数:
1: close:主要用来关闭channel
2: len:用来求长度,比如string,array,slice,map,channel
3: new:用来分配内存,主要用来分配值类型,比如int,struct。返回的是指针
4: make:用来分配内存,主要用来分配引用类型,比如chan,map,slice
5: append:用来追加元素到数组,slice中
6: panic和recover:用来做错误处理
几个小练习:
质数判断:
1.求1到100之内的所有质数,并打印到屏幕上
1: func justfy(n int) bool {
2: for i:=2;i<n;i++ {
3: if n%i == 0 {
4: return false
5: }
6: }
7: return true
8: }
9: func problem1 () {
10: for i:=2;i<100;i++ {
11: if justfy(i) == true {
12: fmt.Printf("%d is prime\n", i)
13: }
14: }
15: }
2.打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。求100到1000之间的所有水仙花数。
1: func is_narcissus(n int) bool {
2: first := n%10
3: second := (n/10)%10
4: third := (n/100)%10
5: sum:= first*first*first + second*second*second + third*third*third
6: if sum == n{
7: return true
8: }
9: return false
10: }
11: func number_array() {
12: for i:=100;i<=1000;i++{
13: if is_narcissus(i) {
14: fmt.Printf("%d is narcissus\n", i)
15: }
16: }
17: }
3.输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。
1: func statistics_str (str string) (){
2: utfChars := []rune(str)
3: countChar,countNum,countSpace,countOther := 0, 0, 0, 0
4: for i:=0;i<len(utfChars);i++ {
5: a := utfChars[i]
6: switch {
7: case a >= 'a' && a <= 'z' || a >= 'A' && a <= 'Z':
8: countChar++
9: case a == ' ':
10: countSpace++
11: case a >= '0' && a <= '9':
12: countNum++
13: default:
14: countOther++
15: }
16: }
17: fmt.Printf("countChar=%d\ncountNum=%d\ncountSpace=%d\ncountOther=%d\n", countChar, countNum, countSpace, countOther)
18: }
|
请发表评论