5.1 Go函数定义
1 Go函数定义
Go函数是指:一段具有独立功能的代码,然后可以在程序中其他地方多次调用。
Go分为自定义函数,系统函数。
函数可以将一个大的工作拆解成小的任务。
函数对用户隐藏了细节。
Golang函数特点:
支持不定长参数
支持多返回值
支持命名返回参数
支持匿名函数、闭包
函数也是类型,可以赋值给变量 一个package下不得有两个同名函数,不支持函数重载 函数参数可以没有,或者多个参数
注意类型在变量名后面
多个连续的函数命名参数是同一类型,除了最后一个类型,其余可以省略
函数可以返回任意数量的返回值
函数体中,形参作为局部变量
函数返回值可以用 _标识符进行忽略 main()函数由编译器调用,其他函数手动调用
Go函数基本语法:
1)形参:函数的输入参数
2)执行代码:实现函数功能的代码块
3)函数的返回值可有可无
func 函数名(形参列表)(返回值列表){
执行代码
return 返回值列表
} func test(x, y int, z string) (int, string) {
//类型相同的相邻参数x,y参数类型可以合并
//多返回值得用括号括起来
n := x + y
return n, z
}
1.1. 函数实战
package main import "fmt" //最普通的函数,无参数,无返回值
func sayHello() {
fmt.Printf("hello world\n")
} //求和函数add
func add(a, b, c int) int {
//sum := a + b + c
//return sum
return a + b
} //接收2个参数a 和b都是int类型
//返回2个参数,sum和sub作为返回值,也叫做对返回值命名
func calc(a, b int) (sum int, sub int) {
sum = a + b
sub = a - b
return
} //接收不定长参数个数,
//参数名是b,类型是不固定个数的int类型
//变量b此时是一个slice切片,数据类型:[]int,可以通过索引取值
func calc_v1(b ...int) int {
sum := 0
for i := 0; i < len(b); i++ {
sum = sum + b[i]
}
return sum
} func main() {
//调用函数
sayHello()
//打印返回值求和结果
fmt.Println(add(5, 5, 5)) //多个返回值
sum1, sub1 := calc(5, 10)
fmt.Printf("calc计算和是%d\n", sum1)
fmt.Printf("calc计算差是%d\n", sub1) //传入不固定长度的参数个数
sum := calc_v1(10, 20, 30, 40)
fmt.Println(sum) }
1.2. Go函数注意事项
1)基本数据类型和数组默认值传递,有一个值拷贝过程,不会修改原本变量的值
package main import "fmt" func modify(n int) {
n = n + 100
fmt.Println("modify函数修改后n=", n)
} func main() {
num := 10
modify(num)
fmt.Println("此时main主程中的nun值=", num)
}
2)如果希望函数可以修改函数外的变量,需要以指针传递,传入变量的地址,函数内以指针方式操作变量。
package main import "fmt" //指针变量,接收一个地址
func modify2(n *int) {
*n = *n + 100
fmt.Println("modify2修改后n的值=", *n)
} func main() {
num2 := 10
modify2(&num2)
fmt.Println("此时main主程中的num2值=", num2)
}
1.3. init函数
每个源文件都会包含一个inti函数,该函数在main函数之前被执行。
package main import "fmt" func init() {
fmt.Println("init函数一般完成初始化工作,如数据库驱动连接等")
} func main() {
fmt.Println("我是主程序")
}
1.4. init函数细节
go程序加载流程:
全局变量
↓
init函数
↓
main函数
package main import "fmt" //全局变量
var num = test() func test() int {
fmt.Println("执行了test()函数")
return 999
} func init() {
fmt.Println("执行了init函数")
} func main() {
fmt.Println("我是主程序")
fmt.Println(num)
}
面试题:
如果再包导入中,main.go和utils.go都有变量加载,init函数,执行流程是?
main.go是程序入口
↓
自上而下,进入import导入
↓
优先进入utils.go 加载全局变量 这是第一步
↓
执行utils.go的init函数 第二步
↓
完毕后,回到main.go的全局变量 第三步
↓
执行main.go的init函数 第四步
↓
执行main.go的主程main()函数 第五步
5.1 Go函数定义的更多相关文章
- 深入理解javascript函数定义与函数作用域
最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...
- JavaScript函数定义和调用 变量作用域
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 JavaScript中函数定义可以是这样的格式 function 函数名(参数) { 函数体 } 也可以是这样的格式 ...
- Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战
002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- scala 学习笔记(01) 函数定义、分支、循环、异常处理、递归
package yjmyzz import scala.io.StdIn object ScalaApp { def main(args: Array[String]) { println(" ...
- Matlab中函数定义方法
Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...
- js 函数定义三种方式
<p>Js 函数定义的三种方式:</p> <br> <p>方式一:function</p> <script type="te ...
- [js]变量声明、函数声明、函数定义式、形参之间的执行顺序
一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('le ...
- scala函数定义的四种方式
最近开始接触scala编程语言,觉得还是比较新的一个东西,虽然说和java比较像,是java的继承者,兼顾面向对象编程和函数式编程的优点,但是,终究是一个新的东西,还是要从最基本的学起.而这当中,函数 ...
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
随机推荐
- 2019-2020-1 20199303《Linux内核原理与分析》第八周作业
Linux如何启动并装载程序 理解编译链接的过程和ELF可执行文件格式 第一步:先编辑一个hello.c 第二步:生成预处理文件hello.cpp gcc -E -o hello.cpp hello. ...
- [C语言] 获得 pwd 的几种函数
_getcwd() GetCurrentDirectory GetModuleFileName main函数参数 argv[0] // crt_getcwd.c // This program pla ...
- java中Future的使用
文章目录 创建Future 从Future获取结果 取消Future 多线程环境中运行 java中Future的使用 Future是java 1.5引入的一个interface,可以方便的用于异步结果 ...
- eclipse 创建maven项目失败
问题描述: eclipse 初次创建maven项目报错 可能是maven-archetype-quickstart:1.1.jar 包失效了或者没有? 有人说把这个jar包放在maven本地仓库里 我 ...
- Mac自带编码转换工具iconv
iconv --help Usage: iconv [OPTION...] [-f ENCODING] [-t ENCODING] [INPUTFILE...] or: iconv -l Conver ...
- 图论--差分约束--POJ 3169 Layout(超级源汇建图)
Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 < ...
- 麦基数(p1045)
描述: \(计算2^{P}−1的位数和最后500位数字(用十进制高精度数表示)\) Ⅰ.求位数 \(因为2^p最后一位必定不为0,求2^p-1的位数也就是求2^p位数\) \(2^p的位数确实很难求, ...
- js获取session对象
- EChart将timeline图标设置为加号
一 要实现的效果 二 官方文档 看一下官方文档上,替换symbol的描述: timeline.symbol string [ default: 'emptyCircle' ] timeline标记的图 ...
- python gdal 写GeoTiff文件
1.gdal数据类型 (1)GDT_Byte(int8) (2)GDT_UInt16 (3)GDT_Int16 (4)GDT_UInt32 (5)GDT_Int32 (6)GDT_Float3 ...