golang保留的函数

init(), main()是golang的保留函数,有如下特点:

  • main() 只能用在main包中,仅可定义一个,init() 可定义任意包,可重复定义,建议只定义一个
  • 两个函数定义时不能有任何返回值
  • 只能由go自动调用,不可被引用
  • init() 先于 main() 执行,并不能被其他函数调用,执行时按照main import顺序执行。

包的执行顺序

  • Go的初始化和执行总是从main.main函数(main包导入其它的包)
  • 同包下的不同 .go 文件,按照以文件名或包路径名的字符串顺序“从小到大”排序顺序执行
  • 其他的包只有被main包 import 才会执行,按照 import 的先后顺序执行;
  • 如果某个包被多次导入的话,在执行的时候只会导入一次;
  • 当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来;
  • 导入顺序与初始化顺序相反 main => p1 => p2 | p2 => p1 => p
  • main被最后一个初始化,因其总是依赖其他包

函数

函数是将具有独立功能的代码组织成为一个整体,使其具有特殊功能的代码集。在Go语言中,函数是一种数据类型,其特性有如下:

  • 支持匿名函数
  • 支持带有变量名的返回值
  • 支持多值返回
  • 支持匿名函数
  • 不支持重载,一个包中不能有两个名字一样的函数。

定义语法


func test(){ } func test(a int, b int){ } func test(a,b int){ } func test(a,b int list...int){ } func test(a int, b int) int{ } func test(a int, b int ) (int,int){ } func test(a,b int) (num int, err error){ }

花括号必须与函数声明在同一行,这种写法是错误的

func test()
{ }

命名返回值名称

package main

import "fmt"

func test(a, b, c int) (he int, cha int) {
he = a + b + c
cha = a - b - c
return
} func main() { a, b := test(15, 10, 5)
fmt.Println(a)
fmt.Println(b) }

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

函数参数传递方式

\1. 值传递

\2. 引用传递

注意:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的持贝。引用传递是地址的持贝,一般来说,地址持贝更为高效。而值持贝取决于拷贝的对象大小,对象越大,则性能越低。

注意2:map、slice、chan、指针、interface默认以引用的方式传递

自定义函数类型

package main

import "fmt"

type ty_func func(int, int) int

func add(a, b int) int {
return a + b
} func operator(op ty_func, a, b int) int {
return op(a, b)
} func main() {
c := add
sum := operator(c, 100, 200) fmt.Println(sum)
}

不定参数

  • 不定参数可以通过下标/循环方式获取参数值
  • 不定参数在定义时,固定参数放前面,不定参数放后面
  • 在对函数调用时,固定参数必须传值,不定参数可以根据需要来决定是否要传值

语法

func {func_name}({param} ...{type}){
func_body
}

参数的类型是一个 {type} 类型的集合

练习:写一个函数add,支持1个或多个int相加,并返回相加结果

package main

import "fmt"

func test(num ...int) {
var sum int
for n := 1; n <= len(num); n++ {
sum += num[(n - 1)]
}
fmt.Println(sum)
} func main() {
test(1)
test(1, 2, 3)
test(1, 2, 3, 4)
}

练习:写一个函数concat,支持1个或多个string相拼接,并返回结果

func concat(age ...string) {
var str string
for _,v := range age {
str += v
} fmt.Println(str)
} func main() {
concat("hellow", " world", " go") }

延迟调用defer

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

用途

  • 关闭文件句柄
  • 锁资源释放
  • 数据库连接释放

defer语句中的变量,在defer声明时就决定了其值

func defer_test() {
i := 0
defer fmt.Println(i) i = 10 fmt.Println(i)
} func main() {
defer_test()
}

多个defer按LIFO(后进先出)的顺序执行

func defer_test() {
i := 0
defer fmt.Println(i) i = 10 fmt.Println(i)
} func main() {
defer_test()
}

defer的作用域,此处可以看到,defer的传入不是在main的作用域下,测试可发现 defer只会在当前函数和方法返回之前被调用。

package main

import "fmt"

func main() {
fmt.Println("block starts")
{
defer fmt.Println("defer runs")
fmt.Println("block ends")
} fmt.Println("main ends")
}

函数作用域

全局变量:既能在函数中使用,也能在其他函数中使用,可以称为定义在函数外的变量。

局部变量:定义在函数内部的变量成为局部变量,局部变量的作用域在函数内部。

如果全局变量的名字和局部变量的名字相同,使用的是局部变量

匿名函数

package main

import "fmt"

var (
test = func(a, b int) int {
return a + b
}(10, 20)
) var test1 = func(age ...int) int {
var sum int for n := 0; n < len(age); n++ {
sum += age[n]
}
return sum
} func main() {
c := test
fmt.Println(c) d := test1(100, 100, 100)
fmt.Println(d)
}

golang:函数总结的更多相关文章

  1. GO开发[四]:golang函数

    函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个 ...

  2. golang函数学习笔记

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

  3. golang 函数作为类型

    golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Prin ...

  4. electron/nodejs实现调用golang函数

    https://www.jianshu.com/p/a3be0d206d4c 思路 golang 支持编译成c shared library, 也就是系统中常见的.so(windows下是dll)后缀 ...

  5. vim支持golang函数调整

    golang函数跳转需要借助godef实现 godef安装如下 go get -v github.com/rogpeppe/godef go install -v github.com/rogpepp ...

  6. Golang函数-递归函数

    Golang函数-递归函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  7. Golang函数-不定参函数

    Golang函数-不定参函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. Golang函数-匿名函数与闭包函数

    Golang函数-匿名函数与闭包函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  9. Golang函数-函数的基本概念

    Golang函数-函数的基本概念 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数的概述 1>.函数定义语法格式 Go语言函数定义格式如下: func 函数名( 函数参 ...

  10. golang 函数和方法

    由于自己是搞python开发的,所以在学习go时,当看到函数和方法时,顿时还是挺蒙的,因为在python中并没有明显的区别,但是在go中却是两个完全不同的东西.在官方的解释中,方法是包含了接收者的函数 ...

随机推荐

  1. java例题_08 输入特定数字求和(n个a位数递增求和问题)

    1 /*8 [程序 8 输入数字求和] 2 题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字.例如 2+22+222+2222+22222(此时共有 5 个数相加), ...

  2. Android Studio 之 制作 Nine-Patch 图片(.9图片)

    •引言 9.png 可以保证图片在合适的位置进行局部拉伸,避免了图片全局缩放造成的图片变形问题. 但是由于Android Studio对于.9图片的检查更加严格,所以不符合AS要求的.9图片会带来很多 ...

  3. OO_Unit4暨学期总结

    OO_Unit4暨学期总结 一.本单元架构设计 1.1 第13次作业架构设计 就我个人而言,这次作业应该是本单元难度最大的一次作业,原因在于陡然转向UML后,对UML各个元素的关系理解需要先下一番功夫 ...

  4. HMS Toolkit助力开发者高效集成HMS Core

    当你的应用想集成华为HMS Core服务和上线华为应用市场,或当你已经开发了一个Android应用并集成了第三方移动服务,需要迁移使用HMS Core服务和上线华为应用市场的时候,如何快速.便捷.高效 ...

  5. 人生第一个扩展——Github1s

    1 灵感 某天看到了一个叫github1s的仓库: 基于Node.JS.Yarn.Python等技术栈,在github.com上面加上"一秒",也就是github1s.com,就能 ...

  6. show engine innodb status 输出结果解读

    show engine innodb status 输出结果解读 基于MySQL 5.7.32 最近想整理一下show engine innodb status的解读,但是发现中文互联网上相关的信息要 ...

  7. Weekly Contest 184

    1408. String Matching in an Array Given an array of string words. Return all strings in words which ...

  8. D - 下个也是签到题 FZU - 2221(博弈)

    ZB loves watching RunningMan! There's a game in RunningMan called 100 vs 100. There are two teams, e ...

  9. 《机器学习Python实现_10_02_集成学习_boosting_adaboost分类器实现》

    一.简介 adaboost是一种boosting方法,它的要点包括如下两方面: 1.模型生成 每一个基分类器会基于上一轮分类器在训练集上的表现,对样本做权重调整,使得错分样本的权重增加,正确分类的样本 ...

  10. 100多个很有用的JavaScript函数以及基础写法大集合

    100多个很有用的JavaScript函数以及基础写法大集合 1.document.write("");为 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:docume ...