【原创】go语言学习(五)函数详解1
2024-10-06 07:50:38
目录
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()
}
最新文章
- PAP认证方式原理和实现
- vector、list、deque三者比较
- 备忘录:hadoop技术一点积累
- 不用插件 让Firefox 支持网页翻译
- JAVA属性和成员的可见性
- JAVA生产者消费者的实现
- git merge 合并分支
- 【leetcode❤python】 299. Bulls and Cows
- bzoj 1191 [HNOI2006]超级英雄Hero(最大基数匹配)
- .Net多线程编程—使用Visual Studio 2012进行调试
- 【Codeforces Round #430 (Div. 2) A C D三个题】
- PHP将图片转base64编码以及base64图片转换为图片并保存代码
- [SimplePlayer] 5. 向音频设备输出音频
- eee
- tuple数组、文件操作
- 【Storm】Storm实战之频繁二项集挖掘(附源码)
- JAVA记录-生成jar包方法
- go语言生成uuid
- Axis开发Web Service
- 64_o2