基本写法

GO的函数基本写法是

  1. func fun(){//无参数,无返回值
  2. }
  3. func fun(参数1 类型,参数2 类型){ //1个到多个参数,无返回值,在这里参数我只写了2个,可以写很多,我没使用...是因为在Go中...有着特殊的含义
  4. }
  5. func fun(参数1 类型,参数2 类型,参数3 ... 类型) 类型{ //1个到多个多个参数,一个返回值
  6. //注意最后的参数3 ... 类型表示可变长的参数,这个参数必须是函数的最后一个参数
  7. //因为是一个返回值所以没用()括起来,当然这个返回值也可以指定返回值的变量名
  8. }
  9. func fun(参数1 类型,参数2 类型,参数3 ... 类型) (返回值1 类型,返回值2 类型){ //1个到多个多个参数,多个返回值
  10. }

再次提醒,如果你要是让别的包可以调用这个函数,函数首字母一定大写。

还有就是import的注意事项:

  1. 当前目录下的引用可以 “./sunny”,Go是不建议这种方式的
  2. 默认的包文件放在$GOPATH/src/或者$GOROOT/src/下,$GOROOT/src/是Go自己的目录,我们自己写的包最好放在$GOPATH/src/下
  3. 包中不能有main方法。
  4. 同目录层中不需要import,可以直接用方法名调用

下图解释了Go的调用过程
图

下面用程序来解释

首先在当前目录下建立一个sunny目录,再次强调这个是不推荐的方式。
sunny.go

  1. package sunny
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. )
  7. func Fun1() { //无参数,无返回值
  8. fmt.Println("This is function Fun1")
  9. }
  10. func Fun2(s1 string, s2 string) { //多个参数,没有返回值
  11. var buf bytes.Buffer
  12. buf.WriteString("This is ")
  13. buf.WriteString(s1)
  14. buf.WriteString(" ")
  15. buf.WriteString(s2)
  16. buf.WriteString(". ")
  17. fmt.Println(buf.String())
  18. }
  19. func Fun3(s1 string, s2 string) string { //多个参数,一个返回值,不指定返回值名称
  20. result := "This is "
  21. result += s1
  22. result += " "
  23. result += s2
  24. result += ". "
  25. return result
  26. }
  27. func Fun4(s1 string, s2 string) (result string) { //多个参数,一个返回值,指定返回值名称
  28. result = "This is "
  29. result += s1
  30. result += " "
  31. result += s2
  32. result += ". "
  33. return //也可以写成return result,不过简写更符合Go的习惯
  34. }
  35. func Fun5(s1 string, s2 string, s ...string) (string, error) {
  36. //多个参数,还包括可变长参数;多个返回值
  37. result := ""
  38. if len(s) == 0 {
  39. return "", errors.New("没有传递可变长变量") //生成一个简单的 error 类型
  40. }
  41. result = "This is "
  42. result += s1
  43. result += " "
  44. result += s2
  45. result += ". "
  46. for _, tmp := range s[:len(s)-1] {
  47. result += tmp
  48. result += "--"
  49. }
  50. for _, tmp := range s[len(s)-1:] {
  51. result += tmp
  52. }
  53. return result, nil
  54. }

下面是调用的函数
pro04_1_1.go

  1. package main
  2. import (
  3. "fmt"
  4. "./sunny" //引入sunny.go
  5. )
  6. func main() {
  7. sunny.Fun1() //无参数,无返回值函数调用
  8. sunny.Fun2("function", "Fun2") //多个参数,没有返回值函数调用
  9. fmt.Println(sunny.Fun3("function", "Fun3")) //多个参数,一个返回值,不指定返回值名称函数调用
  10. fmt.Println(sunny.Fun4("function", "Fun4")) //多个参数,一个返回值,指定返回值名称函数调用
  11. msg, err := sunny.Fun5("function", "Fun5") //多个参数,还包括可变长参数;多个返回值函数调用,不过没有传递可变长参数
  12. if err != nil {
  13. fmt.Println(err)
  14. } else {
  15. fmt.Println(msg)
  16. }
  17. msg, err = sunny.Fun5("function", "Fun5", "a") //多个参数,还包括可变长参数;多个返回值函数调用,且传递了可变长参数
  18. if err != nil {
  19. fmt.Println(err)
  20. } else {
  21. fmt.Println(msg)
  22. }
  23. msg, err = sunny.Fun5("function", "Fun5", "a", "b", "c")
  24. if err != nil {
  25. fmt.Println(err)
  26. } else {
  27. fmt.Println(msg)
  28. }
  29. }

结果显示结果

下面在介绍哦一下——同目录层中不需要import,可以直接用方法名调用。在sunny目录下面再建立一个sunnyMatn.go文件

  1. package sunny
  2. func sunnyAdd(i int, j int) int {
  3. return i + j
  4. }

在sunny.go里面添加

  1. func Fun6() { //同目录层中不需要import,可以直接用方法名调用
  2. fmt.Println(sunnyAdd(2, 3))
  3. }

在main函数里面添加

  1. sunny.Fun6()

结果显示结果

链接