函数
函数是每一种编程语言在构建大型程序时进行连续调用的子单元,一般情况下一个函数,是一定可以完成某种功能,这种功能可以是数据的处理或者包装、也可能是一个HTTP请求,也可以是对数据库的操作等。这种调用单元就是函数,每种语言函数的写法会有差异,但是理论原理都是一样的。以上是我个人的理解,如有问题,可以私信交流哦~
函数声明
在Go语言里面,每个函数声明包含一个名称、一个形参列表、一个可选的返回列表以及函数体:
func name(parameter-list) (result-list){ body }
-
形参列表:指定了一组变量的参数名和参数类型。
-
返回列表: 指定了返回值的类型。
值得注意的是,当一个函数返回一个未命名的返回值或者没有返回值的时候,返回列表的圆括号可以省略。
func hypot(x,y float64) float64 { return math.Sqrt(x*x+y*y) } fmt.Println(hypot(3,4)) //25
递归
递归是指函数可以直接或者间接自己调用自己。递归函数的特性可以使得函数可以非常方便的处理一些带有递归性质的数据结构或者文件目录等。
现在我们使用斐波那契数列来实现一个Go语言的递归函数。
package main import "fmt" func main() { result := 0 for i := 1; i <= 10; i++ { result = fibonacci(i) fmt.Printf("fibonacci(%d) is: %d\n", i, result) } } func fibonacci(n int) (res int) { if n <= 2 { res = 1 } else { res = fibonacci(n-1) + fibonacci(n-2) } return res }
我们再实现一个阶乘的例子:
package main import "fmt" func Factorial(n uint64) (result uint64) { if n > 0 { result = n * Factorial(n-1) return result } return 1 } func main() { fmt.Println(Factorial(10)) }
递归函数虽然使用起来很方便,但是在涉及数据量很大的时候,容易造成内存溢出,这个大家在使用的时候应该注意。
多返回值
GO语言的函数可以返回不止一个结果,如下所示:
package main import "fmt" //返回 X+Y 和 X*Y func Computer(X, Y int) (int, int) { return X+Y, X*Y } func main() { x := 10 y := 20 a, b := Computer(x, y) fmt.Printf("%d + %d = %d\n", x, y, a) fmt.Printf("%d * %d = %d\n", x, y, b) }
但是更多的时候,我们会见到这样的返回多个值,函数返回一个处理结果和一个错误值:
package main import ( "encoding/json" "fmt" "log" ) type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omiy"` Actors []string } var movie = []Movie{ {Title: "vdfv", Year: 1956, Color: true, Actors: []string{"Tom", "Boob"}}, {Title: "Luke", Year: 1956, Color: true, Actors: []string{"Lily"}}, {Title: "Bullitt", Year: 1956, Color: true, Actors: []string{"David"}}, } func main() { marshal, err := json.Marshal(movie) if err != nil { log.Fatalln("JSON marshaling was failed %s", marshal) } fmt.Printf("%s\n", marshal) }
错误的处理策略
-
常见的错误处理策略之一,将错误返回给调用者:
resp,err := http.get(url) if err != nil{ return nil,err }
-
构建错误信息,包含我们需要的信息和错误信息
doc,err := html.Parse(resp.Body) resp.Body.Close() if err != nil { return nil,fmt.Errorf("Parsing %s as HTML: %v ",url,err) }
匿名函数
在func
关键字后面没有函数的名称,则表明这是一个匿名函数。
func (r int) (t int){ return r+1 }
变长函数
变长函数被调用的时候可以有可变的参数个数。
func sum(vars ...int) int{ total := 0 for _,v := range vars{ total += v } return total }
以上就是关于Go语言函数的内容,浅显易懂,希望可以帮助到你学习Go语言~