【Golang】4.用代码形式总结go的函数部分的知识及使用

package main

import (
	"fmt"
	"math"
)

//go语言函数
/*
	func 函数名 ([参数列表]) [返回值]{ 函数体 }
*/

//单返回值, 此形式为值传递, 不影响下面a,b实际的值
func getMax(num1, num2 int) int {
	if(num1 > num2){
		return num1
	}else{
		return num2
	}
}

//返回多个参数返回值, 此形式为值传递
func swap(name1 string, name2 string) (string, string){
	return name2, name1
}

func swapNum(num1, num2 *int){	//可以无返回值
	var temp int
	temp = *num1	//保存num1的值
	*num1 = *num2	//将num2的值付给num1
	*num2 = temp	//将num1的值由中间变量赋值给num2
}

//Go语言函数作为值,这个很新颖,之前没有见过,这个感觉很像是之前有学过的常定义一个函数变量就类似下面这样的感觉
//#define MAX(a,b) (a>b?a:b)

//函数部分的另外一个点是Go语言函数的闭包问题
/*
	闭包也称匿名函数,即内联语句或表达式,我个人对于匿名函数优越在于可以直接使用函数内的变量不必申明的理解是
	在外层的函数内内层函数前定义了一个变量,可以不必进行强调重申就可以直接使用,即在这一个区域内只要不重新定义函数变量来接受返回函数,那么外层的变量就不被重新赋值,在这个范围内循环使用
	看一下下面的例子getPlus函数及相关调用
*/
func getPlus() func() int {		//最最外层返回func函数的结果,结果为int型  整个函数的作用为i值加一
	i := 0
	return func() int  {		//内层函数的返回值结果为int型
		i++
		return i
	}
}								//这种多层嵌套的形式就叫闭包

//结构体类型或命名类型的方法集
//先来定义一个结构体啊
type Circle struct{
	r float64
}
//再定义结构体函数
func (c Circle) getArea() float64 {
	return 3.14*c.r*c.r
}


func main() {
	// 函数调用   调用前先创建两个变量
	var a, b int = 50, 100
	var aa int = 50
	var bb int = 100
	c := getMax(a, b)
	println("a和b相比:",c)
	cc := getMax(aa, bb)
	println("aa和bb相比:",cc)

	//获取多个返回值
	var s1, s2 string = "nike", "adidas"
	tag1, tag2 := swap(s1, s2)
	println(tag1, tag2)
	println("s1的后值:",s1 , "s2的后值:", s2) //未改变
	println("a的原值:",a , "b的原值:", b)	//引用传递,仔细观察  a:50 b:100
	swapNum(&a, &b)
	/* 调用 swap() 函数
	 * &a 指向 a 指针,a 变量的地址
	 * &b 指向 b 指针,b 变量的地址
	 */
	println("a的后值:",a , "b的后值:", b)	//引用传递,仔细观察结果 a:100 b:50

	//!!在这里看一下这个函数作为值的样例!!
	/*
	正常的函数定义形式func 函数名 ([参数列表]) [返回值]{ 函数体 }
	在这里的函数作为值的定义形式为   函数名 := func([参数列表]) [返回值]{ 函数体 }
	可以对比一下
	*/
	getSquareRoot := func(x float64) float64{
		return math.Sqrt(x)
	}
	println(getSquareRoot(9))	//+3.000000e+000 输出结果
	fmt.Println(getSquareRoot(9))	//3 输出结果
	// 这里有一个关于println和fmt.println区别的点日后填坑!!!


	//闭包的调用
	fmt.Println(getPlus())		//此处的结果为0x4875a0,为什么呢??看下面
	getNum := getPlus()
	fmt.Println(getNum())		//i=1
	fmt.Println(getNum())		//i=2
	fmt.Println(getNum())		//i=3
	//!!注意对比啊结果然后体会闭包的意思奥
	getNum0 := getPlus()
	fmt.Println(getNum0())		//i=1
	fmt.Println(getNum0())		//i=2

	//使用结构体的函数
	var c1 Circle
	c1.r = 10.00
	fmt.Println(c1.getArea())	//结果为314 这个地方的使用基本上和c的结构体使用很像
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值