Go函数

1. 函数的定义和使用

package main

import "fmt"

func main() { //程序的入口,是一个特殊的函数
	/*
	函数:function
	一、概念:
		具有特定功能的代码,可以被多次调用执行。
	二、意义:
		1.可以避免重复的代码
		2.增强程序的扩展性
	三、使用
		step1:函数的定义,也叫声明
		step2:函数的调用,就是执行函数中代码的过程
	四、语法
		1.定义函数的语法
			func funcName(parametername type1, parametername type2) (output1 type1, output2 type2) {
				//这里是处理逻辑代码
				//返回多个值
				return value1, value2
			}
			A:func,定义函数的关键字
			B:funcName,函数的名字
			C:(),函数的标志
			D:参数列表:形式参数用于接收外部传入函数中的数据
			E:返回值列表:函数执行后返回给调用处的结果

		2、调用函数的语法
			函数名(实际参数)

		函数的调用处,就是函数调用的位置

		3、注意事项
			A:函数必须先定义,再调用,如果不定义:undefined: getSum
				定义了函数,没有调用,那么函数就失去了意义

			B:函数名不能冲突
			C:main(),是一个特殊的函数,作为程序的入口,由系统自动调用
				而其他函数,程序中通过函数名来调用。
	 */
	//求1-10的和
	getSum() //函数的调用处

	fmt.Println("hello world....")

	//求1-10的和
	getSum()

	fmt.Println("aaa...")

	//求1-10的和
	getSum()
}

//定义一个函数:用于求1-10的和
func getSum() {
	sum := 0
	for i := 1; i <= 100; i++ {
		sum += i
	}
	fmt.Printf("1-100的和是:%d
", sum)
}

2. 函数的参数

package main

import "fmt"

func main() {
	/*
	函数的参数:
		形式参数:也叫形参。函数定义的时候,用于接收外部传入的数据的变量。
			函数中,某些变量的数值无法确定,需要由外部传入数据。

		实际参数:也叫实参。函数调用的时候,给形参赋值的实际的数据


	函数调用:
		1.函数名:声明的函数名和调用的函数名要统一
		2.实参必须严格匹配形参:顺序,个数,类型,一一对应的。
	 */

	//1.求1-10的和
	getSum(10)
	//2.求1-20的和
	getSum(20)
	fmt.Println()

	//3.1-100的和
	getSum(100)

	//4.求2个整数的和
	getAdd(20,10)
	getAdd2(1,2)

	fun1(1.3,2.4,"hello")
}

//定义一个函数:用于求1-10的和
func getSum(n int) {
	sum := 0
	for i := 1; i <= n; i++ {
		sum += i
	}
	fmt.Printf("1-%d的和是:%d
",n, sum)
}

func getAdd(a int,b int){
	sum := a + b
	fmt.Printf("%d + %d = %d 
",a,b,sum)
}

func getAdd2(a, b int){//参数的类型一致,可以简写在一起
	fmt.Printf("a:%d,b:%d
",a,b)
}

func fun1(a,b float64,c string){
	fmt.Printf("a:%.2f,b:%.2f,c:%s
",a,b,c)
}

3. 可变参数

package main

import "fmt"

func main() {
	/*
		可变参数:
			概念:一个函数的参数的类型确定,但是个数不确定,就可以使用可变参数。

			语法:
				参数名 ... 参数的类型

				对于函数,可变参数相当于一个切片。
				调用函数的时候,可以传入0-多个参数。

				Println(),Printf(),Print()
				append()

			注意事项:
				A:如果一个函数的参数是可变参数,同时还有其他的参数,可变参数要放在
					参数列表的最后。
				B:一个函数的参数列表中最多只能有一个可变参数。

	 */
	//1.求和
	getSum()

	getSum(1,2,3,4,5)

	getSum(1,2,3,4,5,6,7,8,9,10)

	//2.切片
	s1 :=[]int{1,2,3,4,5}
	getSum(s1...)
}

func getSum(nums ... int){
	//fmt.Printf("%T
",nums) //[]int
	sum := 0
	for i := 0;i <len(nums);i++{
		sum += nums[i]
	}
	fmt.Println("总和是:",sum)
}

func fun1(s1,s2 string,nums ... float64){

}

4. 值传递和应用传递

package main

import "fmt"

func main() {
	/*
	数据类型:
		一:按照数据类型来分:
				基本数据类型:
					int,float,string,bool
				复合数据类型:
					array,slice,map,struct,interface。。。。

		二:按照数据的存储特点来分:
				值类型的数据:操作的是数值本身。
					int,float64,bool,string,array
				引用类型的数据:操作的是数据的地址
					slice,map,chan

	参数传递:
		A:值传递:传递的是数据的副本。修改数据,对于原始的数据没有影响的。
			值类型的数据,默认都是值传递:基础类型,array,struct



		B:引用传递:传递的是数据的地址。导致多个变量指向同一块内存。
			引用类型的数据,默认都是引用传递:slice,map,chan

	 */
	 arr1 := [4]int{1,2,3,4}
	 fmt.Println("函数调用前,数组的数据:",arr1) //[1 2 3 4]
	 fun1(arr1)
	 fmt.Println("函数调用后,数组的数据:",arr1) //[1 2 3 4]
	 
	 s1 :=[] int{1,2,3,4}
	 fmt.Println("函数调用前,切片的数据:",s1) // [1 2 3 4]
	 fun2(s1)
	 fmt.Println("函数调用后,切片刀数据:",s1) //[100 2 3 4]
}

//引用传递
func fun2(s2 []int){
	fmt.Println("函数中,切片的数据:",s2) //[1 2 3 4]
	s2[0] = 100
	fmt.Println("函数中,切片的数据更改后:",s2) //[100 2 3 4]
}

//值传递
func fun1(arr2 [4]int){
	fmt.Println("函数中,数组的数据:",arr2) //[1 2 3 4]
	arr2[0] =100
	fmt.Println("函数中,数组的数据修改后:",arr2) //[100 2 3 4]
}

5. 函数的返回值

package main

import "fmt"

func main() {
	/*
	函数的返回值:
		一个函数的执行结果,返回给函数的调用处。执行结果就叫做函数的返回值。

	return语句:
		一个函数的定义上有返回值,那么函数中必须使用return语句,将结果返回给调用处。
		函数返回的结果,必须和函数定义的一致:类型,个数,顺序。

		1.将函数的结果返回给调用处
		2.同时结束了该函数的执行

	空白标识符,专门用于舍弃数据:_
	 */

	//1.设计一个函数,用于求1-10的和,将结果在主函数中打印输出
	res := getSum()
	fmt.Println("1-10的和:",res) //1-10的和: 55

	fmt.Println(getSum2()) //5050

	res1,res2 := rectangle(5,3)
	fmt.Println("周长:",res1,",面积:",res2) //周长: 16 ,面积: 15
	res3,res4 := rectangle2(5,3)
	fmt.Println("周长:",res3,",面积:",res4) //周长: 16 ,面积: 15

	_,res5 := rectangle(5,3)
	fmt.Println(res5) //15
}

//函数,用于求矩形的周长和面积
func rectangle(len,wid float64)(float64,float64){
	perimeter := (len +wid) *2
	area := len * wid
	return perimeter,area
}

func rectangle2(len,wid float64)(peri float64,area float64){
	peri = (len +wid)*2
	area = len*wid
	return
}


func fun1()(float64,float64,string){
	return 2.4,5.6,"hello"
}


//定义一个函数,带返回值
func getSum()int {
	sum := 0
	for i:=1;i<=10;i++{
		sum += i
	}
	return sum

}

func getSum2()(sum int){//定义函数时,指明要返回的数据是哪一个
	for i:=1;i<=100;i++{
		sum += i
	}
	return
}
package main

import "fmt"

func main() {
	/*
	return语句:词义"返回"
		A:一个函数有返回值,那么使用return将返回值返回给调用处
		B:同时意味着结束了函数的执行

	注意点:
		1.一个函数定义了返回值,必须使用return语句将结果返回给调用处。return后的数据必须和函数定义的一致:个数,类型,顺序。
		2.可以使用_,来舍弃多余的返回值
		3.如果一个函数定义了有返回值,那么函数中有分支,循环,那么要保证,无论执行了哪个分支,都要有return语句被执行到
		4.如果一个函数没有定义返回值,那么函数中也可以使用return,专门用于结束函数的执行。。
	 */
	a, b, c := fun1()
	fmt.Println(a, b, c)
	_, _, d := fun1()
	fmt.Println(d)
	fmt.Println(fun2(-30))
	fun3()
}

func fun1() (int, float64, string) {
	return 0, 0, "hello"
}

func fun2(age int) int {
	if age >= 0 {
		return age

	} else {
		fmt.Println("年龄不能为负。。")
		return 0
	}
}

func fun3(){
	for i:=0;i<10;i++{
		if i == 5{
			//break //?强制结束循环
			return
		}
		fmt.Println(i)
	}
	fmt.Println("fun3()...over....")
}
原文地址:https://www.cnblogs.com/yzg-14/p/12247494.html