Go中函数的使用方法与注意事项是什么
今天主机评测网小编给大家分享一下Go中函数的使用方法与注意事项是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
细节汇总
函数的形参列表可以是多个,返回值列表也可以是多个
形参列表和返回值列表的数据类型,可以是值类型、也可以是引用类型
函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写表示该函数可以被本包文件和其它文件使用,类似public;首字母小写只能被本包文件使用,类似private。
函数中的变量是局部的,外部不能访问。作用域
基本数据类型和数组都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值,
如果希望函数内的变量能够修改函数外的变量,可以传入变量的地址(
&
),函数内以指针的方式操作变量,从效果上看类似引用Go函数不支持函数重载。
在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量是一个函数类型的变量,通过该变量可以对函数调用。
函数既然是一种数据类型,因此在Go中,函数也可以作为形参,并且调用。(回调函数)
为了简化数据类型定义,Go支持自定义数据类型
语法: type 自定数据类型名 数据类型 (相当于一个别名)
案例:
type myInt int
这时,myInt就等价于int来使用了type mySum func(int, int) int
这时,mySum
就等价于func(int, int) int
支持对函数返回值命名(可以不受返回值顺序限制)
使用
_
下划线标识符,忽略返回值。(占位符)Go支持可变参数
值传递和指针传递
functest(n1int){n1=n1+10fmt.Println("testn1=",n1)}//指针类型接收处理functest02(n2*int){*n2=*n2+10fmt.Println("test02n2=",*n2)}funcmain(){n1:=20n2:=2test(n1)//值类型test02(&n2)//指针类型fmt.Println("mainn1=",n1)fmt.Println("mainn2=",n2)}
什么是重载
重载: 函数名相同,但是形参不同或者数据类型不同的情况。
Golang语言中是不支持传统的函数重载的,fn redeclared in this block
Golang语言是支持可变参数的,空接口的形式
函数类型的变量
类型: func(int, int) int
funcgetSum(n1int,n2int)int{returnn1+n2}funcgetSums(n1int,n2int,n3int)int{returnn1+n2+n3}//main函数sumFn:=getSumres:=sumFn(10,20)fmt.Printf("%T%v\n",res,res)//int30fmt.Printf("%T\n",sumFn)//func(int,int)intsumsFn:=getSumsresult:=sumsFn(10,20,30)fmt.Printf("result:%T%v\n",result,result)//result:int60fmt.Printf("sumsFn类型:%T\n",sumFn)//sumsFn类型:func(int,int)int
函数作为形参传入
funcgetSum(n1int,n2int)int{returnn1+n2}functestFn(fnVarfunc(int,int)int,num1int,num2int)int{returnfnVar(num1,num2)//调用传入的函数,并返回值}//函数类型形参sumFn:=getSumtotal:=testFn(sumFn,1,2)fmt.Println("total=",total)//3
自定义数据类型
自定义函数数据类型, 相当于起了一个别名
typemySumfunc(int,int)intfunctestFn(fnVarmySum,num1int,num2int)int{returnfnVar(num1,num2)}//functestFn(fnVarfunc(int,int)int,num1int,num2int)int{//returnfnVar(num1,num2)//}
自定义数据类型
//main函数下typemyIntintvarnum1myInt=2//varnum2int=num1//这样是报错的,myInt和int并不等价varnum2int=int(num1)//显式类型转换fmt.Printf("num1的类型:%T值:%v\n",num1,num1)//num1的类型:main.myInt值:2fmt.Printf("num2的类型:%T值:%v\n",num2,num2)//num2的类型:int值:2
定义的类型: 包名.类型名,如:
utils.myInt
//以下是utils包packageutilsimport"fmt"funcTestFn()string{fmt.Println("TestFn函数被调用")typemyIntintvarnmyInt=10fmt.Printf("n的类型:%T值:%v",n,n)//n的类型:utils.myInt值:10return"hahaha"}
返回值命名
funcsumSub(n1int,n2int)(sumint,subint){//这里不需要声明sum,sub变量了,也不用在return时写sum=n1+n2sub=n1-n2return}//main函数sum,sub:=sumSub(9,8)fmt.Println("sum=",sum,"sub=",sub)//sum=17sub=1
可变参数
基本语法
支持零到多个参数
func sum(args... int) {}
支持1到多个参数
func sum(n1 int, args... int) {}
args:就是一个承接的变量名,可以自定义,如:func sum(n1 int, **vars**... int) {}
说明:
args是slice切片,通过
args[index]
可以访问到各个值args必须放到形参列表的最后面
参数个数可变
funcsumV2(n1int,args...int)int{sum:=n1fmt.Printf("args类型是:%T\n",args)//args类型是:[]int//遍历args切片fori:=0;i<len(args);i++{sum+=args[i]}returnsum}//main函数//参数可变total02:=sumV2(1,2,3,4)fmt.Println("total02=",total02)//total02=10
总结练习
交换变量a, b的值
packagemainimport"fmt"funcswap(n1*int,n2*int){*n1=*n1+*n2*n2=*n1-*n2//*n1*n1=*n1-*n2//*n2}funcmain(){a:=12b:=20swap(&a,&b)fmt.Println("a=",a,"b=",b)}
以上就是“Go中函数的使用方法与注意事项是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注主机评测网行业资讯频道。