浏览 906
扫码
基本写法
GO的函数基本写法是
func fun(){//无参数,无返回值}func fun(参数1 类型,参数2 类型){ //1个到多个参数,无返回值,在这里参数我只写了2个,可以写很多,我没使用...是因为在Go中...有着特殊的含义}func fun(参数1 类型,参数2 类型,参数3 ... 类型) 类型{ //1个到多个多个参数,一个返回值//注意最后的参数3 ... 类型表示可变长的参数,这个参数必须是函数的最后一个参数//因为是一个返回值所以没用()括起来,当然这个返回值也可以指定返回值的变量名}func fun(参数1 类型,参数2 类型,参数3 ... 类型) (返回值1 类型,返回值2 类型){ //1个到多个多个参数,多个返回值}
再次提醒,如果你要是让别的包可以调用这个函数,函数首字母一定大写。
还有就是import的注意事项:
- 当前目录下的引用可以 “./sunny”,Go是不建议这种方式的
- 默认的包文件放在$GOPATH/src/或者$GOROOT/src/下,$GOROOT/src/是Go自己的目录,我们自己写的包最好放在$GOPATH/src/下
- 包中不能有main方法。
- 同目录层中不需要import,可以直接用方法名调用
下图解释了Go的调用过程
下面用程序来解释
首先在当前目录下建立一个sunny目录,再次强调这个是不推荐的方式。
sunny.go
package sunnyimport ("bytes""errors""fmt")func Fun1() { //无参数,无返回值fmt.Println("This is function Fun1")}func Fun2(s1 string, s2 string) { //多个参数,没有返回值var buf bytes.Bufferbuf.WriteString("This is ")buf.WriteString(s1)buf.WriteString(" ")buf.WriteString(s2)buf.WriteString(". ")fmt.Println(buf.String())}func Fun3(s1 string, s2 string) string { //多个参数,一个返回值,不指定返回值名称result := "This is "result += s1result += " "result += s2result += ". "return result}func Fun4(s1 string, s2 string) (result string) { //多个参数,一个返回值,指定返回值名称result = "This is "result += s1result += " "result += s2result += ". "return //也可以写成return result,不过简写更符合Go的习惯}func Fun5(s1 string, s2 string, s ...string) (string, error) {//多个参数,还包括可变长参数;多个返回值result := ""if len(s) == 0 {return "", errors.New("没有传递可变长变量") //生成一个简单的 error 类型}result = "This is "result += s1result += " "result += s2result += ". "for _, tmp := range s[:len(s)-1] {result += tmpresult += "--"}for _, tmp := range s[len(s)-1:] {result += tmp}return result, nil}
下面是调用的函数
pro04_1_1.go
package mainimport ("fmt""./sunny" //引入sunny.go)func main() {sunny.Fun1() //无参数,无返回值函数调用sunny.Fun2("function", "Fun2") //多个参数,没有返回值函数调用fmt.Println(sunny.Fun3("function", "Fun3")) //多个参数,一个返回值,不指定返回值名称函数调用fmt.Println(sunny.Fun4("function", "Fun4")) //多个参数,一个返回值,指定返回值名称函数调用msg, err := sunny.Fun5("function", "Fun5") //多个参数,还包括可变长参数;多个返回值函数调用,不过没有传递可变长参数if err != nil {fmt.Println(err)} else {fmt.Println(msg)}msg, err = sunny.Fun5("function", "Fun5", "a") //多个参数,还包括可变长参数;多个返回值函数调用,且传递了可变长参数if err != nil {fmt.Println(err)} else {fmt.Println(msg)}msg, err = sunny.Fun5("function", "Fun5", "a", "b", "c")if err != nil {fmt.Println(err)} else {fmt.Println(msg)}}
结果显示
下面在介绍哦一下——同目录层中不需要import,可以直接用方法名调用。在sunny目录下面再建立一个sunnyMatn.go文件
package sunnyfunc sunnyAdd(i int, j int) int {return i + j}
在sunny.go里面添加
func Fun6() { //同目录层中不需要import,可以直接用方法名调用fmt.Println(sunnyAdd(2, 3))}
在main函数里面添加
sunny.Fun6()
结果显示