Golang函数的常见形式和一些基础的注意事项
  • 分类:Golang
  • 发表:2020-02-24
  • 围观(8,126)
  • 评论(1)

Go的函数和Python的函数有许多相似的地方,两者都支持变长函数,支持返回多个返回值。但是Golang作为静态编译型语言在语法上相比Python而言更加的严谨一些,这个也无可厚非了。

两者最大的区别在我看来是Python是面向对象的语言,它是有类这个概念的,所以在Python中函数就是方法,这两者没有本质的区别。但是由于Golang不是面向对象语言,没有类的这个概念,所以Go的类需要使用结构体来实现。因此在Go中有结构体绑定的函数叫方法,这个和别的语言是有区别的。

Go规定如果需要被导出的函数,即可以被外部包访问调用的函数,函数名首字母英文大写,反之亦然。

一个完整的函数声明结构格式如下:

func funcName(input type1, input2 type2) (output1 type1, output2 type2) {
  // 逻辑代码
  return value1, value2 // 返回多值
}

普通函数

// 返回两数之和
func muti(x, y int) int {
  return x * y
}

注意:如果函数参数中多个参数类型相等,可以将类型省略。

// 交换两参数
func swap(x, y string) (string, string) {
  return y, x
}

参数变长函数

func strJoin(str ...string) string {
  return strings.Join(str, "==")
}

目前来说,Go中的变长参数只能是同一种类型,否则编译会报错。

匿名函数和闭包

// 匿名函数
max := func(x, y int) int {
  if x > y {
    return x
  }
  return y
}

// 闭包
func countRecord() func() int {
  i := 0
  return func() int {
    i++
    return i
  }
}

使用结构体实现“类”

因为Go没有类的概念,需要通过结构体的函数绑定来实现类的功能,而此时函数也不叫函数了,在这里应该叫方法。

package main

import (
  "fmt"
)

type Rectangle struct {
  length float32
  width  float32
}

func main() {
  var r Rectangle
  r.width = 12
  r.length = 24
  fmt.Printf("面积为:%f", r.getArea())
}

func (r Rectangle) getArea() float32 {
  return r.length * r.width
}

总结

Go的函数形式只有这么几种的话那也太平平无奇了,事实上Go语言函数还有很多比较先进的思想,例如多返回值、延迟语句,Panic异常可Recover异常捕获...这些函数特点可以更高效的编写Go语言的函数。

更高阶的用法需要等到后期我对概念更加理解之后再来分享,这篇文章仅仅用来记录学习过程。

共有 1 条评论

  1. JinF

    冲冲冲!

Top