go语言函数一、函数定义细节

  1. 函数形参和返回值可以是多个;
  2. 函数的形参和返回值类型可以是值类型和引用类型;
  3. 函数命名规范遵循标识符命名规范,同时首字母大写可被其他包引用,小写则不可被其他包引用;
  4. 函数中的变量是局部的;
  5. 基本数据类型和数组默认都是值传递,会进行值拷贝,函数内修改不会影响原来的值,如果想要在函数内修改外部的变量,可以用&传递变量地址,函数内以指针的方式操作变量;
  6. go语言函数不支持重载(同名函数会报错);

eg:

func add(n1 *int, n2 *int) {
    *n1 = *n1 + *n2
}

func main() {
    num1 := 20
    num2 := 30
    add(&num1, &num2)
}
  1. 在go语言中,函数本身就是一种数据类型,可以用来赋值给一个变量,之后该变量就是一个函数类型的变量,通过该变量可以对函数进行调用;
func get_sum(n1 int, n2 int) int {
    return n1 + n2
}

func main() {
    // 将函数赋值给变量
    a := get_sum
    fmt.Printf("a type:%T, get_sum type:%T", a, get_sum)
    // 使用a进行函数调用
    res := a(10, 20)
}
  1. 在go中,函数作为一种数据类型,也是可以作为形参在函数里面被调用的(是不是感觉类似c中于给一个函数传函数指针进行回调)
func myfunc(my_func func(int, int) int, num1 int, num2 int) int {
    return my_func(num1, num2)
}
  1. go也支持自己定义数据类型,类似于c/c++中的typedef,语法如下:
    type 自定义数据类型名 数据类型
    我们也是可以把函数定义成自定义的类型,相当于起个别名
// 在go中虽然myint和int都是int类型,但go认为他们是从语法上两个类型,对应的变量不能直接赋值,需要进行显示转换
type myint int 
type mysum_type func_sum(int, int) int

func main() {
    var1 int = 5
    var2 myint = 6
    var1 = int(var2) // 需要进行强转
}

我们可以利用自定义类型重写上面的myfunc

func myfunc(my_func mysum_type, num1 int, num2 int) {
    return my_func(num1, num2)
}
  1. go支持对返回值命名,这让我们函数返回和对其利用方便许多,同时返回时无需指定参数,返回值的顺序和定义的顺序保持一致
func cal(num1 int, num2 int) (sum int, diff int) {
     sum = num1 + num2
     diff = num1 + num2
     return // 无需指定sum和diff
}
func main() {
    a, b = cal(10, 5)
}
  1. 返回值可以使用_下划线忽略
    如上面的
_, b = cal(10, 5)
  1. go语言中函数也支持可变参数列表,语法如下:
// 支持0 到多个可变参数
func sum(args... int) sum int {
}
// 支持1个到多个可变参数
func sum(n1 int, args... int) sum int {
}

arg是go语言中的切片slice类型,可以通过下标访问到各个值args[index]

func sum(n1, args... int) int {
    sum := n1
    for i = 0; i < len(args); i++ {
        sum += args[i]
    }
}

这里args也可以起其他名,同时,可变参数列表必须放在固定参数的后面

  1. 如果我们函数的参数列表都是同一种数据类型,则可进行简写,写法如下:
// 这里n1, n2都是float64
func sum(n1, n2 float64) float64 {
    return n1 + n2
}

你可能感兴趣的:(go/golang基础及实践,后端,golang)