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学习之String与int的相互转换

    •String 转 int 两种方式 int a = Integer.parseInt(s);int b = Integer.valueOf(s).intValue(); 代码 public clas ...

  2. Nacos 2.0 正式发布,性能提升了 10 倍!!

    前不久,在3月20号,Nacos 2.0.0 正式发布了!我简单看了下官方的介绍,可能nacos未来逐渐会成为各大公司作为服务治理和配置中心的主要中间件. Nacos 简介:一个更易于构建云原生应用的 ...

  3. 不想eject,还咋修改create-react-app的配置?

    一.先抛问题 许多刚开始接触create-react-app框架的同学,不免都会有个疑问:如何在不执行eject操作的同时,修改create-react-app的配置.今天胡哥就来带大家一起来看看这个 ...

  4. Istio最佳实践系列:如何实现方法级调用跟踪?

    赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher 管理委员,Istio 项目贡献者,热衷于开源.网络和云计算.目前主要从事服务网格的开源和研发工作. 引言 TCM(Ten ...

  5. H5 端 rem 适配方案与 viewport 适配

    H5 端 rem 适配方案与 viewport 适配 rem rem 是 CSS3 新增的一个相对单位(root em,根 em) 只根据当前页面 HTML 页面的 font-size 设置,如果根目 ...

  6. nmap使用/参数,及绕过防火墙

    nmap是什么? 它是一种一个很强大的扫描工具,端口,版本号,统统都可以给你扫出来 我的IP网段:192.168.1.0 咱们先找一个主机随便玩玩把,反正没有害处,最多被防火墙拦截了 nmap -sP ...

  7. 简单的介绍一下Java设计模式:解释器模式

    目录 定义 意图 主要解决问题 优缺点 结构 示例 适用情况 定义 解释器模式是类的行为型模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器,客户端可以使用这个解释器来 ...

  8. 利用Apache部署静态网站(一)

    Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充, ...

  9. [BUAA2021软工助教]案例分析作业总结

    目录 一.作业链接 二.优秀作业推荐 A+作业推荐 A作业推荐 三.总结 所有案例分析总结 特色与优点 问题与建议 不同类产品案例分析Bug汇总 CSDN问答社区.Stack Overflow.Seg ...

  10. 初中级php程序员面试时常见问题整理

    初中级php程序员面试问题收集 感悟 有时候草率给出一个答案,比思而无果更糟糕 php基础 php的数据类型 php数据类型的转换 php魔术方法 php 的trait的概念及特点 php 虚拟类和接 ...