声明语法

func 函数名 (参数列表) [(返回值列表)] {}

Golang函数特点

a. 不支持重载,一个包不能有两个名字一样的函数
b. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
c. 匿名函数
d. 多返回值

函数的参数传递方式

值传递

引用传递

注意1:
无论是值传递,还是引用传递,传递给函数的都是变量的副本,
不过,值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址
拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能
越低。
注意2:
map、slice、chan、指针、interface默认以引用的方式传递
/*
package main import "fmt" func modify(a int) {
a = 100
} func main(){
a := 8
fmt.Println(a)
modify(a)
fmt.Println(a)
}
*/
// 修改上面的程序, 使其正确 package main import "fmt" func modify(a *int) {
*a =
} func main(){
a :=
fmt.Println(a)
modify(&a)
fmt.Println(a)
}

练习 13

命名返回值的名字

func add(a, b int) (c int) {
c = a + b
return
}

_标识符, 用来忽略返回值

func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a +b)/
return
}
func main() {
sum, _ := calc(, )
}

可变参数

func add(arg…int) int {    // 0个或多个参数

}
func add(i int, arg…int) int {    // 1个或多个参数

}
func add(i int, j int, arg…int) int {    // 2个或多个参数

}
注意:
其中arg是一个slice,我们可以通过arg[index]依次访问所有参数
通过len(arg)来判断传递参数的个数
// 写一个函数add, 支持一个或多个int相加, 并返回相加结果

package main

import "fmt"

func add(x int, arg...int) int{
var sum int = x
for i := ; i < len(arg); i++ {
sum += arg[i]
}
return sum
} func main(){
res := add(, )
fmt.Println(res)
}

练习14

// 写一个函数concat, 支持一个或者多个string相拼接, 并返回结果

package main

import "fmt"

func concat(str string, arg...string)(res string){
res = str
for i := ; i < len(arg); i++ {
res += arg[i]
}
return
} func main(){
res := concat("plm", "asd")
fmt.Println(res)
}

练习 15

defer的用途

. 当函数返回时,执行defer语句。因此,可以用来做资源清理
. 多个defer语句,按 先进后出 的方式执行
. defer语句中的变量,在defer声明时就决定了

应用:

1. 关闭文件句柄

func read(){
file := open(filename)
defer file.Close() //文件操作 }

2. 锁资源释放

func read() {
mc.Lock()
defer mc.Unlock()
//其他操作
}

3. 数据库连接释放

func read() {
conn := openDatabase()
defer conn.Close()
//其他操作
}

Go开发之路 -- 函数详解的更多相关文章

  1. [转]javascript console 函数详解 js开发调试的利器

    javascript console 函数详解 js开发调试的利器   分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...

  2. loadrunner 脚本开发- web_url函数详解

    脚本开发- web_url函数详解 by:授客 QQ:1033553122   加载指定url的web页面(GET请求) C语言函数 int web_url( const char *StepName ...

  3. 【转】angularjs指令中的compile与link函数详解

    这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下   通常大家在 ...

  4. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

  5. angularjs指令中的compile与link函数详解

    这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下   通常大家在 ...

  6. jQuery.hasClass() 函数详解

    jQuery.hasClass() 函数详解 hasClass()函数用于指示当前jQuery对象所匹配的元素是否含有指定的css类名. 该函数属于jQuery对象(实例). 语法 JavaScrip ...

  7. Linux中fork()函数详解(转载)

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  8. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  9. NSSearchPathForDirectoriesInDomains函数详解

    NSSearchPathForDirectoriesInDomains函数详解     #import "NSString+FilePath.h" @implementation ...

随机推荐

  1. 用 Java 解密 C# 加密的数据(DES)(转)

    今天遇到java解密url的问题.我们的系统要获取外部传过来的URL,URL是采用 DES 算法对消息进行加密,再用 BASE64 编码.不过对方系统是用 C# 写的. 在网上搜了几篇文章终于找到一篇 ...

  2. Android双击Home键返回桌面

    转载自:http://blog.csdn.net/dl10210950/article/details/60866407 2中方式,都是监听返回键 一种 1 private long time; /* ...

  3. External Snapshot management

    External Snapshot management Symptom As of at least libvirt 1.1.1, external snapshot support is inco ...

  4. Ansible配置免密登陆

    0x01:  把远程服务器的公钥来获取到本地 #ssh-keyscan ip1 ip2 ip3 ip4 >> /root/.ssh/known_hosts 完成后,/root/.ssh/k ...

  5. AIO系列文档(2)----TIO使用

    AIO系列文档(1)----图解ByteBuffer中介绍了ByteBuffer用法,下面通过介绍t-io介绍如何使用: hello world例子简介 本例子演示的是一个典型的TCP长连接应用,代码 ...

  6. [Swift]LeetCode171. Excel表列序号 | Excel Sheet Column Number

    Given a column title as appear in an Excel sheet, return its corresponding column number. For exampl ...

  7. [Swift]LeetCode416. 分割等和子集 | Partition Equal Subset Sum

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  8. NumPy 学习笔记(三)

    NumPy 数组操作: 1.修改数组形状 a.numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下修改形状 b.numpy.ndarray.flat 是 ...

  9. chmod命令相关

    原文地址:https://www.jianshu.com/p/862a9938cc09 chmod命令用于修改文件的权限. Linux文件的三种身份和四种权限 三种身份 u:文件的拥有者: g:文件所 ...

  10. VSCode与Deepin资源管理器冲突

    解决方式: xdg-mime default dde-file-manager.desktop inode/directory 此外,网上有较多推荐(在deepin 15.8版本上测试无效): gvf ...