Go语言函数(5)| Go主题月

281 阅读5分钟

前言

函数几乎是每个语言都要用到的语法,函数的封装目的就是代码复用,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就是需要它的高效率。好了,今天就到此为止了,明天见。