`

Go语言函数

阅读更多

函数是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

分享到:
评论

相关推荐

    Go语言教程:Go语言函数介绍

    Go语言教程:Go语言函数介绍Go语言教程:Go语言函数介绍Go语言教程:Go语言函数介绍Go语言教程:Go语言函数介绍Go语言教程:Go语言函数介绍Go语言教程:Go语言函数介绍

    Go语言基础、进阶、提高课程第四节 Go语言函数,游戏关卡策划讲解1

    第四节 Go 语言函数 21、函数的定义 22、Go 方法 63、实现游戏服务器日志函数 84、课后作业—难度: 95、深度分析塔防游戏关卡设计 106、微信公

    go语言中文手册,标准库手册,教程,圣经打包下载(更新)

    html格式,带全文搜索. 在学习go的过程中需要查询各种资料和书籍 手册....包括以下书籍(html): go标准库文档 Go语言标准库 go指南 go_web编程 Go_基础教程 go语言圣经 Go入门指南 Go...Go 语言(Golang).pdf 学习go语言.pdf

    Go语言圣经,golang学习入门到精通

    就事后诸葛的角度来看,Go语言的这些地方都做的还不错:拥有自动垃圾回收、一个包系统、 函数作为一等公民、词法作用域、系统调用接口、只读的UTF8字符串等。但是Go语言本身只有很少的特 性,也不太可能添加太多的...

    Go语言函数学习教程

    本文实例讲述了Go语言函数基本用法。分享给大家供大家参考,具体如下: 这里要说一下是Go函数和一些其他语言不一样的地方 1 函数格式不同 代码如下:func GetMsg(i int) (r string) {  fmt.Println(i)  r = “hi”...

    Go 语言递归函数

    Go 语言递归函数 递归,就是在运行的过程中调用自己。 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recursion() } Go 语言支持递归。但我们在使用递归时,开发者需要设置...

    GO语言完全参考手册CHM版

    谷歌最新开发语言,安卓开发语言热门候选,年度语言新星

    go语言圣经 .pdf

     Go语言天然并发,只需要关键字“go”就可以让函数并发执行,使得并发编程变得更为简单,这也是Go语言最大的优势。 四、Go语言能做什么开发  Go语言是非常有潜力的语言,是因为它的应用场景是目前互联网非常热门...

    Go语言·云动力 高清

    《Go语言鄠动力》是Go语言程序设计入门书,介绍了Go语言的基础知识,包括静态类型、流程控制、函数、动态类型、面向对象、并发编程等内容,以及同其他C类语言相比,Go所具备的全新特性。同时,《Go语言鄠动力》还...

    go语言 思维导图 基础、函数

    go语言 思维导图 基础、函数

    Go-Gitgo-提供了一些用于与Git仓库交互的Go函数

    Gitgo - 提供了一些用于与Git仓库交互的Go函数

    go语言技能之函数、工程管理教学资料和源码.rar

    go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码go语言技能资料及源码...

    Go语言入门指南大纲及框架建议:轻松掌握Go语言学习秘诀.docx

    Go语言入门指南大纲及框架建议:轻松掌握Go语言学习秘诀 1. Go语言概述  Go语言的历史和创造者  Go语言的主要特性和优势  Go语言的应用领域 2. 安装与配置  在不同操作系统(Windows, macOS, Linux)上安装...

    Go语言中的延迟函数defer示例详解

    大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦。Go 语言中延迟函数 defer 充当着 try…catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞...

    go语言的应运

    ●go的参数传递,都是值的...● go语言的声明 min,max :=0,100 (int类型) var s string (string类型) ● 位钱:是一种使用加密手段制作的分布式电子货币。 位钱地址编码使用EncodeBase58Check函数。(电子支付手段)

    开源、跨平台的Go语言开发工具 LiteIDE.zip

    Go语言Api函数检索 代码导航 查找使用 代码重构 Go playground支持 其他支持 Markdown Json Golang Present 支持的操作系统 Windows ...

    GO语言基础学习文档

    一、 GO语言环境搭建 2 二、 Go 命令 2 go build 3 go clean 4 go fmt 4 go get 4 go install 4 go test 4 go doc(godoc) 5 三、 Go基础 5 关键字 5 定义变量 5 常量 6 内置基础类型 6  Boolean 6  数值类型 6 ...

    GO语言延迟函数defer用法分析

    本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下: defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理、释放...

Global site tag (gtag.js) - Google Analytics