函数

在go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句

  • 函数的定义

定义一个最简单的加法函数

func Add(a int,b int)(ret int,err error){
if a < 0 || b < 0{
err = errors.New("这个函数只支持两个非负数的数字相加")
return
} return a + b,nil
}

如果参数列表中若干相邻的参数类型是相同的话,比如上述例子中的a和b,则可以在参数列表中省略前面的类型声明,例如:

func Add(a,b int)(ret int,err error){
// ...
}

如果返回值列表中多个返回值的类型相同,也可以用同样的方式合并

如果函数只有一个返回值,也可以这样写:

func Add(a,b int) int{
// ...
}
  • 函数的调用

函数调用非常方便,只需要事先导入了该函数所在的包,就可以直接调用了,在go语言中,对函数命名有一定要求,只有大写开头的字母才可以被其他包调用,小写字母开头的函数只能在本包被调用

例:假设Add函数在func1中

package main

import (
"fmt"
//导入包
"functions/func1"
) func main() {
a := 1
b := 2
// 通过包名调用函数
ret,err := func1.Add(a,b)
fmt.Println(ret,err)
}

函数的不定参数

  • 不定参数的类型

不定参数是值函数传入的参数个数为不定数量。

func main(){
// myfunc函数可以接收任意个int类型的参数
myfunc(1,2,3,4,5,6,7,8)
} // ... 表示不定参数
func myfunc(args ...int){
for _,arg := range args {
fmt.Println(arg)
}
}

...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。。它是一

个语法糖(syntactic sugar),即这种语法对语言的功能并没有影响

从内部实现机理上来说,类型...type本质上是一个数组切片,也就是[]type,这也是为

什么上面的参数args可以用for循环来获得每个传入的参数。

假如没有...type这样的语法糖,开发者将不得不这么写:

func myfunc2(args []int) {
for _, arg := range args {
fmt.Println(arg)
}
}

从函数的实现角度来看,这没有任何影响,该怎么写就怎么写。但从调用方来说,情形则完

全不同:

myfunc2([]int{1, 3, 7, 13})
  • 任意类型的不定参数
func myfunc(args ...interface{}){
// ...
}

用interface{}传递任意类型数据是go语言的惯例用法

匿名函数与闭包

  • 匿名函数

匿名函数由一个不带函数名的函数声明和函数体组成,如:

func(a,b int) bool {
return a * b
}

匿名函数可以直接赋值给一个变量或者直接执行

// 赋值给一个变量
f := func(a,b int) int {
return a * b
} // 直接执行
func(a,b int) bool {
return a * b
}(1,2)
  • 闭包

    • 闭包的基本概念:闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者

      任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含

      在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环

      境(作用域)。
    • 闭包的价值:闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示

      数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到

      变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

    • go语言中的闭包
func main()  {
var j int = 5
//一个函数的返回值是一个函数的执行
a := func()(func()) {
var i int = 10
return func() {
fmt.Printf("i,j : %d %d \n",i,j)
}
}()
a()
j *= 2
a() }

Golang中的函数的更多相关文章

  1. Golang中设置函数默认参数的优雅实现

    在Golang中,我们经常碰到要设置一个函数的默认值,或者说我定义了参数值,但是又不想传递值,这个在python或php一类的语言中很好实现,但Golang中好像这种方法又不行.今天在看Grpc源码时 ...

  2. golang中匿名函数的应用-回调函数-闭包

    package main import ( "fmt" "strconv" ) type funcType func(int, int) int // 自定义函 ...

  3. Golang中使用lua进行扩展

    前言 最近在项目中需要使用lua进行扩展,发现github上有一个用golang编写的lua虚拟机,名字叫做gopher-lua.使用后发现还不错,借此分享给大家. 数据类型 lua中的数据类型与go ...

  4. Golang基础之函数

    golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...

  5. 第十九课 golang中的下划线

    在 Golang 里, _ (下划线)是个特殊的标识符. 用在 import 在导包的时候,常见这个用法: 1 2 import _ "net/http/pprof" import ...

  6. Golang调用windows下的dll动态库中的函数

    Golang调用windows下的dll动态库中的函数 使用syscall调用. package main import ( "fmt" "syscall" & ...

  7. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

  8. golang中的init初始化函数

    0.1.索引 https://waterflow.link/articles/1666090530880 1.概念 1.1.源文件里的代码执行顺序 init 函数是用于初始化应用程序状态的函数. 它不 ...

  9. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

随机推荐

  1. [转]imageMagick 在nodejs中报错Error: spawn identify ENOENT的解决方案

    同时还有 Error: Could not execute GraphicsMagick/ImageMagick 这个问题, 也参考了 https://blog.csdn.net/chenxinpen ...

  2. 简单的jQuery hide()方法演示

    <!DOCTYPE html><html><head><meta charset="utf-8"> <title>jQu ...

  3. C#生成.tlb文件初认识

    刚接手同事的代码,生成文件时,发现生成了一个对应的dll文件(应用程序中输出类型为类库),和一个对应的.tlb文件,但是报如下的错误: 那么.tlb文件是如何生成的呢? 选择项目->右键属性-& ...

  4. 学号 2018-2019-20175212 实验一 《Java开发环境的熟悉》

    学号 2018-2019-20175212 实验一 <Java开发环境的熟悉> 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 mkdir 20175212exp1创建20 ...

  5. Spring Boot(一)

    (一)如何使用IDEA新建一个Spring Boot项目 https://www.cnblogs.com/wmyskxz/p/9010832.html

  6. 总结const、readonly、static三者的区别

    const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编译时常量的原因是它编译时会将其替换为所对应的值: b.静态 ...

  7. 深入理解hashCode

    1.hashCode的概念 (1)hashCode方法是Object类的方法,在Java里所有类都默认继承Object类,即所有类都有hashCode方法. (2)hashCode是jdk根据对象的存 ...

  8. 跟随我在oracle学习php(15)

    开发环境 独立开发环境:组成 Windows/Linux php Apache MySQL 集成开发环境:phpstudy wamp xammp 关系数据库: SQL: Struct Query La ...

  9. C#或unity中实现正弦函数

    C#或unity中实现正弦函数 本类用于第一,需要绘制一条正弦曲线的朋友:第二,需要根据正弦曲线控制物体运动的朋友:里面都有注释,代码如下: unity中使用的代码: public class Cur ...

  10. c语言中,在结构体中如何将void *转存为具体需要的数据类型

    1. 只需要将该void *类型成员,强制转换为具体的数据类型指针即可.需要注意的是,该强制转换是有风险的,转换时,必须确定void*指向内存实际数据为目标结构体格式,否则可能会出现内存越界访问,从而 ...