知名自助建站平台wordpress表单购买
2026/5/23 13:45:38 网站建设 项目流程
知名自助建站平台,wordpress表单购买,vps看网站蜘蛛,青岛制作公司网站文章目录函数定义函数调用参数传递函数用法函数变量函数闭包修改代码加深印象执行顺序例子同其他语言一样#xff0c;go语言也有函数的概念#xff0c;主要是为了代码复用#xff0c;函数是基本的代码块#xff0c;用于执行一个任务。Go 语言最少有个 main() 函数#xff…文章目录函数定义函数调用参数传递函数用法函数变量函数闭包修改代码加深印象执行顺序例子同其他语言一样go语言也有函数的概念主要是为了代码复用函数是基本的代码块用于执行一个任务。Go 语言最少有个 main() 函数同时main函数也是整个程序执行的入口。函数定义Go 语言函数定义格式如下funcfunction_name([parameter list])[return_types]{// 函数体}func函数关键字任何一个函数都有func关键字开始声明。function_name函数名称参数列表和返回值类型构成了函数签名。parameter list参数列表参数列表指定的是参数类型、顺序、及参数个数。参数是可选的也就是说函数也可以不包含参数。return_types返回类型函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值这种情况下 return_types 不是必须的。函数体函数定义的代码集合。注意go语言函数区别于c和java语言的地方是可以有多个返回值多个返回值用小括号括起来中间用逗号分隔。代码展示packagemainimportfmtfuncswap(x,ystring)(string,string){returny,x}funcmain(){a,b:swap(Google,Hello)fmt.Println(a,b)}运行结果Hello Google函数调用当创建函数时你定义了函数需要做什么通过调用该函数来执行指定任务。调用函数向函数传递参数并返回值例如packagemainimportfmtfuncmain(){/* 定义局部变量 */varaint100varbint200varretint/* 调用函数并返回最大值 */retmax(a,b)fmt.Printf(最大值是%d\n,ret)}/* 函数定义返回两个数的最大值 */funcmax(num1,num2int)int{/* 定义局部变量 */varresultintifnum1num2{resultnum1}else{resultnum2}returnresult}运行结果最大值是200参数传递在golang中函数的参数传递都是值传递不存在引用传递(区别于c)注意使用值传递的时候虽然会改变形参的值但并不会改变函数外变量即实参的值。代码展示packagemainimportfmtfuncmain(){/* 定义局部变量 */varaint100fmt.Printf(自增前 a 的值为%d\n,a)add(a)fmt.Printf(自增后 a 的值%d\n,a)}/* 函数定义自增1 */funcadd(aint){a;fmt.Printf(add里a的值%d\n,a)}运行结果自增前 a 的值为100 add里a的值101 自增后 a 的值100函数用法函数变量一切皆变量go语言里什么都可以当作变量来使用当然函数也不例外函数可以作为函数变量。Go 语言可以很灵活的创建函数并作为另一个函数的实参。以下实例中我们在定义的函数中初始化一个变量该函数仅仅是为了使用内置函数代码展示packagemainimport(fmtmath)funcmain(){/* 声明函数变量 */getSquareRoot:func(xfloat64)float64{returnmath.Sqrt(x)// 求一个数的平方根}/* 使用函数变量调用函数 */fmt.Println(getSquareRoot(9))}运行结果3再举一个用函数变量作回调函数的例子packagemainimportfmt// 声明一个函数类型typefcfunc(int)intfuncmain(){CallBack(1,callBack)//执行函数--CallBack}funcCallBack(xint,f fc){//定义了一个函数 testCallBackf(x)//由于传进来的是callBack函数该函数执行需要传入一个int类型参数因此传入x}funccallBack(xint)int{fmt.Printf(我是回调x%d\n,x)returnx}运行结果我是回调x1函数闭包所谓闭包就是匿名函数go语言支持匿名函数调用。匿名函数就是一个“内联”语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量不必声明这样有时候可以使代码更简单增强代码的可读性代码展示packagemainimportfmtfuncgetNumber()func()int{i:0returnfunc()int{i1returni}}funcmain(){/* nextNumber 为一个函数函数中 i 为 0 */nextNumber:getNumber()/* 调用 nextNumber 函数i 变量自增 1 并返回 */fmt.Println(nextNumber())fmt.Println(nextNumber())fmt.Println(nextNumber())/* 创建新的函数 nextNumber1并查看结果 */nextNumber1:getNumber()fmt.Println(nextNumber1())fmt.Println(nextNumber1())}运行结果12312注意多次调用同一个函数nextNumber其中的变量是同一个初始值为0每调用一次自增1。下面补充解释一下上面代码为什么会出现这样的结果首先getNumer这个函数会返回一个闭包函数我们先理解闭包是啥闭包就是等于 匿名函数捕获的变量我们可以看到第7行-第10行闭包函数里面捕获了变量因为i不是在闭包函数里面定义的15行代码通过getNumber获取了一个闭包函数 —nextNumber181920行分别执行一次nextNumber函数每次就会自增1并且因为每次调用都是固定的结果会累计所以会输出12323行重新获取了一个闭包函数是独立于上面闭包函数的所以重新输出123同一个闭包会引用同一个变量因此这里的i会递增。修改代码加深印象packagemainimportfmtfuncgetNumber()func()int{i:0fmt.Printf(getNumber中i的地址%v\n,i)returnfunc()int{i1fmt.Printf(闭包里i的地址%v\n,i)returni}}funcmain(){/* nextNumber 为一个函数函数中 i 为 0 */nextNumber:getNumber()/* 调用 nextNumber 函数i 变量自增 1 并返回 */fmt.Println(nextNumber())fmt.Println(nextNumber())fmt.Println(nextNumber())/* 创建新的函数 nextNumber1并查看结果 */nextNumber1:getNumber()fmt.Println(nextNumber1())fmt.Println(nextNumber1())}rootGoLang:~/proj/goforjob# go run main.gogetNumber中i的地址0xc000012098 闭包里i的地址0xc0000120981闭包里i的地址0xc0000120982闭包里i的地址0xc0000120983getNumber中i的地址0xc000102000 闭包里i的地址0xc0001020001闭包里i的地址0xc0001020002执行顺序例子packagemainimportfmtfunc铁扇公主()func()string{法宝:芭蕉扇returnfunc()string{fmt.Println(宝宝肚肚打雷了)return法宝}}funcmain(){something:铁扇公主()fmt.Printf(猴哥拿到了 %v! \n,something())}rootGoLang:~/proj/goforjob# go run main.go宝宝肚肚打雷了 猴哥拿到了 芭蕉扇!rootGoLang:~/proj/goforjob#之后我会持续更新如果喜欢我的文章请记得一键三连哦点赞关注收藏你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 ↖(▔▽▔)↗感谢支持

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询