【原创】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 ", i)
}

fmt.Printf("running ")
fmt.Printf("reutrn: ")
}

/*
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 ", i)
i = 1000
fmt.Println("i=%d ", 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
", 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 , 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
", 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()
}

  

原文地址:https://www.cnblogs.com/wangshuyang/p/11727945.html