Go语言函数

guhao022 · · 2273 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

函数是Go语言里面的核心设计,它通过func来声明,函数可以有一个或者多个参数,每个参数后面都要带有类型,通过“,”分隔,可以返回多个值,函数的格式为:

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

返回值声明了两个变量output1和output2,如果不想声明也可以,但是要保留两个类型声明

如果只有一个返回值且不声明返回值变量,可以省略“包括返回值”的括号 

如果没有返回值就直接省略最后的返回信息

一个实际应用函数的例子(用来计算最大值)

package main

import "fmt"

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
func main() {
	x := 3
	y := 4
	z := 5
	max_xy := max(x, y) //调用函数 max(x, y)
	max_xz := max(x, z)
	fmt.Printf("max(%d,%d) = %d\n", x, y, max_xy)
	fmt.Printf("max(%d,%d) = %d\n", x, z, max_xz)
	fmt.Printf("max(%d,%d) = %d\n", y, z, max(y, z)) //直接调用
}

多个返回值

例子:

package main

import "fmt"

//返回A+B和A*B
func sub(A, B int) (int, int) {
	return A + B, A * B
}
func main() {
	x := 3
	y := 4
	xPLUSy, xTIMESy := sub(x, y) //调用函数 sub(x, y)
	fmt.Printf("xPLUSy(%d,%d) = %d\n", x, y, xPLUSy)
	fmt.Printf("xTIMESy(%d,%d) = %d\n", x, y, xTIMESy)
}

变参

Go语言支持变参,接受变参的函数有不定数量的参数,为了做到这一点,首先需要定义函数使其接受变参。

func myfunc(arg ...int) {}

arg ...int 告诉我们Go语言这个函数接受不定数量的参数。注意,这些参数的类型全部时int。在函数体中,变量arg时一个int的slice

for _, n := arg {
    fmt.Printf("And the number is: %d\n", n)
}

 

传值与指针

函数的普通传值只是传值的copy,而实参不会变化,比如

package main

import "fmt"

func add(a int) int {
	a = a + 1
	return a
}
func main() {
	x := 3
	fmt.Printf("x = %d\n", x)    //输出x=3
	x1 := add(x)                 //调用函数
	fmt.Printf("x+1 = %d\n", x1) //输出x+1=4
	fmt.Printf("x = %d\n", x)    //继续输出x,应该为x=3
}

如果想真正的传 x 本身的话就需要指针了,变量在内存中是存放于一定的地址上,修改变量实际是修改变量地址处的内存。

例子

package main

import "fmt"

func add(a *int) int {
	*a = *a + 1 //修改了a的值
	return *a   //返回新值
}
func main() {
	x := 3
	fmt.Printf("x = %d\n", x)    //输出x=3
	x1 := add(&x)                //调用函数 传x的内存地址
	fmt.Printf("x+1 = %d\n", x1) //输出x+1=4
	fmt.Printf("x = %d\n", x)    //继续输出x,应该为x=4
}

这样就达到了修改x的目的。传指针的好处:可以使多个函数能操作同一个对象,可以传递体积大的结构体

 

defer延迟语句

当你进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露:

func ReadWrite() bool {
    file.Open("file")
    defer file.Close()
    if failureX {
        return false
    }
    if failureY {
        return false
    }
    return true
}

如果有很多调用defer,那么defer采用后进先出模式

 

 


发布于:http://www.golune.com/blog/content/c45ae5ed3c92d1277173d43fafba4a4b8652f


有疑问加站长微信联系(非本文作者)

本文来自:ITEYE博客

感谢作者:guhao022

查看原文:Go语言函数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2273 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传