前言
函数几乎是每个语言都要用到的语法,函数的封装目的就是代码复用,Go语言跟C和C++一样使用了一个叫main()函数的入口函数,main()函数作为了整个程序执行的入口,可想而知Go语言函数是多么重要,Go语言也有类似面对对象的思想,要深入理解后面的面对对象代码复用就必须熟悉函数这里的知识。
函数基础
Go语言的函数关键字就是func,func让我联想到的是Javascipt和php的函数function的简写,定义一个函数例子:
func test(){
fmt.Println("hello world");
}
test(); //调用test函数,输出hello world
函数的参数与返回值
参数
跟大多数语言一样可以传递参数,用在函数内部进行计算,参数必须指定参数类型。可以传递单个,多个参数,不定参数(不指定参数个数) 参数类型除了常用的整数,字符串还可以传递指针,函数,结构体(后面在讲)等等。 看下传递不定参数的例子:
var s1,s2,s3 = "hello","world","Go";
func test(args ...string){
for _,value := range args{ //_表示一个遍历下标的,因为它不输出,但是要给它一个位置,它很特殊,因为Go语言定义的变量不使用就会报错,但是_除外
fmt.Println(value); //value就是args里面的每一个值
}
}
test(s1,s2,s3); //在main函数中执行字符串个数可以传递多个,个数不确定,依次输出"hello","world","Go"
指针
指针这里可以仔细说一下,因为指针通常会跟函数一起用,用指针传递节约内存空间,用值传递就会占用一个内存空间存放同样的值。指针就是存放变量或者常量。函数等的内存地址,可以用**&表示指针存放的地址** ,代表变量存放的内存地址,内存地址不可以参与运算,可以用指针代表的值进行运算,想要学会Go语言的高级功能这个必须要深入理解,这里举一个简单的指针参数的例子():
var s1 int = 1;
func test(a * int){ //test函数接收一个int类型的指针参数,形参为a,形参不懂可以去百度一下,哈哈
fmt.Println(*a); //输出a这个指针所存放实际的值,1
mt.Println(&a); //输出a这个指针的地址,例如像:0xc00000e031
}
test(&s1); //在main函数中执行,传递实参的内存地址的值,可以让test函数自动识别这是个指针,而不是字符串。
这里非常重要,对于没有使用过指针这个概念的语言的人来说还是有点难度。再来举一个例子加深印象,使用指针交换两个变量的值
var s1 ,s2 = "hello","world"; //这里又换了一种定义变量的方法,记不清楚看第二篇,哈哈,让编译器自己决定变量类型
func change(s1, s2 *string) { //接收指针存放的值为string类型的变量的内存地址(变量的内存地址也叫指针)
// 取s1的指针的地址, 给临时变量value
value := *s1;
// 取s2的指针的地址, 给s1指针指向的变量
*s1 = *s2;
// 将s1的指针的地址(也就是中间临时变量的指针地址)给s2的指针指向的变量
*s2 = value;
}
//下面三句话在main函数执行
fmt.Println("s1:",s1,"s2:",s2); //输出原值 s1: hello s2: world
change(&s1,&s2); //传入两个变量的内存地址函数内交换
fmt.Println("s1:",s1,"s2:",s2); // 输出交换后的值s1: world s2: hello
指针基础用法到此了解这里,更高级的用法在后面,敬请期待,嘿嘿。
返回值
Go语言函数的肯定会有返回值,返回值这个东西可有可无,返回值用return 这个关键字。在定义函数的时候 还可以定义它的返回的类型和个数,名称,这样做的好处是可以做到用在函数最后使用单个关键字return 来直接返回函数处理后的结果(前提在函数中定义了返回值的名称),例如:
//这里又换了一个定义变量的方式
var (
name string = "Go"
age int = 12
gender string = "name"
)
//经过实验证明形参名不能与返回参数名字相同,不然会出现重复定义的错误
func test(name string , age int,gender string )(nameplus string , ageplus int,genderplus string ) { //返回值这里可以省略返回值名字,只需要类型就行了,但是return那里必须指定变量名
nameplus = name+" nb"; //加减需要搞清楚变量类型
ageplus = age+10086;
genderplus = gender+"???";
return //只要在return指定定义了返回值名称,就可以单独使用return返回这些返回值,真方便
}
fmt.Println(test(name, age,gender)); //在main函数执行,输出内容:Go nb 10098 name???
总结
函数有一些高级的用法,我们下篇说,例如闭包,匿名函数,函数也可以传递参数,函数也可以当作返回值,函数的高级用法必须要学会,为学习Go语言并发知识打下扎实基础,毕竟学Go就是需要它的高效率。好了,今天就到此为止了,明天见。