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函数定义的更多相关文章

  1. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  2. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

  3. Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

    002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...

  4. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  5. scala 学习笔记(01) 函数定义、分支、循环、异常处理、递归

    package yjmyzz import scala.io.StdIn object ScalaApp { def main(args: Array[String]) { println(" ...

  6. Matlab中函数定义方法

    Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...

  7. js 函数定义三种方式

    <p>Js 函数定义的三种方式:</p> <br> <p>方式一:function</p> <script type="te ...

  8. [js]变量声明、函数声明、函数定义式、形参之间的执行顺序

    一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('le ...

  9. scala函数定义的四种方式

    最近开始接触scala编程语言,觉得还是比较新的一个东西,虽然说和java比较像,是java的继承者,兼顾面向对象编程和函数式编程的优点,但是,终究是一个新的东西,还是要从最基本的学起.而这当中,函数 ...

  10. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...

随机推荐

  1. $_FILES上传错误类型

    $_FILES['file']['error']其值为 0,没有错误发生,文件上传成功. 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值. 其值 ...

  2. libeay32.dll 1.0.2j crash

    https://github.com/BOINC/boinc/issues/2470 他们认为是CPU不同造成的 另外一个可能的原因 Changes between 1.0.2j and 1.0.2k ...

  3. Java ASM3学习(3)

    MethodVisitor ClassVisitor的visitMethod能够访问到类中某个方法的一些入口信息,那么针对具体方法中字节码的访问是由MethodVisitor来进行的 访问顺序如下,其 ...

  4. 如何在github上递交高质量的pull request

    开源的一大乐趣就是任何人都可以参与其中.试想下一个流行的项目就有你贡献的代码,是一件多么爽的事情!你可以帮助项目健康发展,添加你希望添加的功能,以及修复你发现的BUG. 作为全球最大的开源社区GitH ...

  5. Spring PropertyPlaceholderConfigurer类载入外部配置

    2019独角兽企业重金招聘Python工程师标准>>> 通常在Spring项目中如果用到配置文件时,常常会使用org.springframework.beans.factory.co ...

  6. ACM思维题训练 Section A

    题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...

  7. CentOS联网问题

    CentOS 7安装好了之后,默认是没有自动联网的,每次启动系统后,之前都是要用到的时候手动联网,最近喜欢用无界面的方式登录系统,所以联网显得比较麻烦. 为了解决这个麻烦,必须让系统启动的时候就自动连 ...

  8. Python网络数据采集- 创建爬虫

    1. 初见网络爬虫 1.1 网络连接 输出某个网页的全部 HTML 代码. urllib 是 Python 的标准库(就是说你不用额外安装就可以运行这个例子),包含了从网络请求数据,处理 cookie ...

  9. 设计模式(Java语言)- 原型模式

    原型模式(Prototype Pattern)也有人将原型模式称为克隆模式,是属于创造型设计模式,用于创建重复的对象,提供了一种创建对象的最佳方式.原型模式需要实现Cloneable接口,来实现对象的 ...

  10. Redux在项目中的文件结构

    React + Redux   今天我们来唠唠在React一般项目中,使用Redux进行状态管理的时候,相对的如何存放reducer.action.api之类文件的结构与使用时机吧.本章默认看官们已经 ...