【原创】go语言学习(五)函数详解1
目录
1、函数介绍
2、多返回值和可变参数
3、defer语句
4、内置函数介绍
1、函数介绍
1.1定义:
有输⼊入、有输出,⽤用来执⾏行行⼀一个指定任务的代码块。
func functionname([parametername type]) [returntype] { //function body } //其中参数列列表和返回值列列表是可选
1.2⽆无参数和返回值的函数
func functionname() { //function body }
1.3实现两个数相加
// 两数相加 // 三个整数相加简写:func add(a , b, c int) int{ func add(a int, b int) int { sum := a + b return sum }
1.4如何连续的⼀一系列列参数的类型是一样,前⾯面的类型可以不不写如何连续的
// 多返回值 // func calc(a, b int) (int, int){ func calc(a, b int) (sum int, sub int) { sum = a + b sub = a - b // sum := a + b // sub := a - b // return sum, sub //第二中写法 return }
1.5函数调用
// 多返回值 // func calc(a, b int) (int, int){ func calc(a, b int) (sum int, sub int) { sum = a + b sub = a - b // sum := a + b // sub := a - b // return sum, sub //第二中写法 return } func main() { sum, sub := calc(200 ,100) fmt.Printf("%d %d", sum, sub) }
2、多返回值和可变参数
2.1多返回值
func calc(a, b int) (int, int) {
sum := a + b sub := a - b return sum, sub
}
func main() {
sum, sub := add(2, 3)
}
2.2对返回值进⾏行行命名
func calc(a, b int) (sum int, sub int) { sum = a + b sub = a - b return } func main() { sum, sub := add(2, 3) }
2.3对返回值进⾏行行命名
func calc(a, b int) (sum int, sub int) { sum = a + b sub = a - b return } func main() { sum, sub := add(2, 3) }
2.4_标识符
func calc(a, b int) (sum int, sub int) { sum = a + b sub = a - b return } func main() { sum, _ := add(2, 3) }
2.5 可变参数
// 可变参数 func calc_v1(b ...int) int { sum := 0 for i := 0; i < len(b); i++ { sum = sum + b[i] } return sum }
// 固定参数和可变参数
func calc_v2(a int, b ...int) int {
sum := a
for i := 0; i < len(b); i++ {
sum = sum + b[i]
}
return sum
}
3、defer语句
3.1 多个defer语句句,遵循栈的特性:先进后出
// defer返回执行 // defer作用资源释放 func testDefer1() { defer fmt.Println("hello") defer fmt.Println("hello v2") defer fmt.Println("hello v3") fmt.Println("aaaaaa") fmt.Printf("bbbbbbbb") } /* 结果: defer,后进先出,压栈 aaaaaaa bbbbbbb hello v3 hello v2 hello */
func testDefer2() {
for i := 0; i < 5; i++ {
defer fmt.Printf("i=%d\n", i)
}
fmt.Printf("running\n")
fmt.Printf("reutrn:\n")
}
/*
runging
return
i=4
i=3
i=2
i=1
i=0
*/
// defer, 是预先定义的,只是return时返回结果
func testDefer3() {
var i int = 0
defer fmt.Printf("defer i=%d\n", i)
i = 1000
fmt.Println("i=%d\n", i)
}
/*
1000
defer i = 0
*/
4、内置函数介绍
4.1. close:
主要⽤用来关闭channel
4.2. len:
用来求长度,比如string、array、slice、map、channel
4.3. new:
用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针4.4. make:⽤用来分配内存,主要⽤用来分配引⽤用类型,⽐比如chan、map、slice
4.5. append:
⽤用来追加元素到数组、slice中
4.6. panic和recover:
⽤用来做错误处理理
5、练习
package main import "fmt" func justify(n int) bool { if n <= 1 { return false } // 质数是除了他自己,不被任何数整除 for i := 2; i < n; i++ { if n%i == 0 { return false } } return true } // 1-100的质数 func example1() { for i := 2; i < 100; i++ { if justify(i) == true { fmt.Printf("[%d] is prinme\n", i) } } } func is_shuixianhuashu(n int) bool { first := n % 10 second := (n / 10) % 10 third := (n / 100) % 10 //fmt.Printf("first:%d second:%d third %d\n", n , first, second, third) sum := first*first*first + second*second*second + third*third*third if sum == n { return true } return false } // 水仙花束 x^3 + y^3 + z^3 = xyz func example2() { for i := 2; i < 100; i++ { if is_shuixianhuashu(i) == true { fmt.Printf("[%d] is shuixianhuashu\n", i) } } } // 统计字符串中,字符,数字,空格,其他字符的个数 func calc(str string) (charCount int, numCount int, spaceCount int, otherCount int) { // 转为字符串utf-8 utfChars := []rune(str) for i := 0; i < len(utfChars); i++ { if utfChars[i] >= 'a' && utfChars[i] <= 'z' || utfChars[i] >= 'A' && utfChars[i] <= 'z' { charCount++ continue } if utfChars[i] >= '0' && utfChars[i] <= 9 { numCount++ continue } if utfChars[i] >= ' ' { numCount++ continue } otherCount++ } return } func example3() { var str string = " dfsafa d范德萨 3984234" charCount, numCount, spCount, other := calc(str) fmt.Printf("charCount:%d, numCount:%d, spCount:%d, other:%d", charCount, numCount, spCount, other) } func main() { //example1() //example2() example3() }