Golang学习笔记(五):函数

函数

Go语言里面的核心设计,通过关键字func来声明

代码如下:

func funcName(input type1, input2 type2) (output1 type1, output2 type2) {
    //logical code
    return value1, value2
}

基本语法

1.语法

代码如下:

//一般函数
func func_name(a int) {
    println(a)
}

//多参数,无返回值
func func_name(a, b int, c string) {
    println(a, b, c)
}

//单个返回值
func func_name(a, b int) int { //同类型,可以省略  a, b int
    return a + b
}

//多个返回值
func func_name(a, b int) (c int, err error) {  //返回值还可以是   (int, error)
    return a+b, nil
}

func SumAndProduct(A, B int) (int, int) {
    return A+B, A*B
}

2.说明:

代码如下:

关键字func声明
可以有一个或多个参数,每个参数后面带有类型,通过","分隔函数可以返回多个值
返回值声明,可以只声明类型
    如果没有返回值,可以省略最后的返回信息
    如果有返回值,必须在外层添加return

Go函数不支持嵌套(nested),重载(overload)和默认参数(default parameters)
支持:
    1.无需声明原型
    2.不定长度变参
    3.多返回值
    4.命名返回值参数
    5.匿名函数
    6.闭包

注意:
    函数使用func开头,左大括号不能另起一行

小写字母开头的函数指在本包内可见,大写字母开头的函数才能被其他包调用

多返回值及命名返回参数

可以像python那样返回多个结果,只是非tuple

对于不想要的返回值,可以扔垃圾桶_

如果用命名返回参数,return语句可以为空。return 不为空,返回值顺序是return的顺序而非在函数头声明的顺序

代码如下:

package main

func change(a, b int) (x, y int) {
    x = a + 100
    y = b + 100

return   //101, 102
    //return x, y  //同上
    //return y, x  //102, 101
}

func main(){
    a := 1
    b := 2
    c, d := change(a, b)
    println(c, d)

如果命名返回参数被代码块中的同名变量覆盖了,就必须使用显式return返回结果

不需要强制命名返回值,但是命名后的返回值可以让代码更加清晰,可读性更强

参数传递:传值与传指针

指针, Go保留指针,用"."而非"->"操作指针目标对象成员 操作符

代码如下:

& 取变量地址
* 通过指针间接访问目标函数

func add1(a int) int {
    a = a + 1
    return a
}

x := 3
x1 := add1(x)
x //3
x1 //4
传值,x1的值没有改变

func add2(a *int) int {
    *a = *a + 1
    return *a
}
x := 3
x1 := add2(&x)
x // 4
x1 // 4

传指针多个函数能操作同一个对象

传指针比较轻量级(8byte),只是传内存地址,我饿们可以用指针来传递体积大的结构体

Go语言中,string,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传指针

注意,若函数需要改变 slice长度,仍需要取地址传指针

参数传递:可变参数

变参本质上就是一个slice,且必须是最后一个形参

将slice传递给变参函数时,注意用…展开,否则会被当做dang单个参数处理,和python类似

代码如下:

package main

func sum(s string, args ...int)  {
    var x int
    for _, n := range args {
        x += n
    }
    println(s, x)
}
func main(){
   sum("1+2+3=", 1, 2, 3)

x := []int{0,1,2,3,4}
   sum("0+1+2+3=", x[:4]...)
}

...type类型只能作为函数的参数类型存在,并且是最后一个参数
本质上是一个数组切片,即[]type

任意类型的不定参数

代码如下:

func Printf(format string, args ...interface{}) {
}

匿名函数

代码如下:

f := func(x,y int) int {
    return x + y
}

函数作为值、类型

在Go语言中,函数也是一种变量,可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值

语法

代码如下:

type typeName func (input1 inputType1, input2 inputType2 [, ....]) (result1 resultType1 [,....])

用法e.g.1

代码如下:

type testInt func(int) bool //声明了一个函数类型

func filter(slice []int, f testInt) []int {
    var result []int
    for _, value := range slice {
        if f(value) {
            result = append(result, value)
        }
    }
}

func isOdd(integer int) bool {
    if integer % 2 == 0 {
        return false
    }
    return true
}

filter(a, isOdd)

这种用法,在写接口的时候非常有用

用法e.g.2

可以定义函数类型,也可以将函数作为值进行传递(默认值nil)

代码如下:

package main

//定义函数类型callback
type callback func(s string)

//定义一个函数,可以接收另一个函数作为参数
// sum为参数名称, func(int, int) int为参数类型
func test(a, b int, sum func(int, int) int)  {
    println( sum(a,b) )
}

func main(){
    //演示1
    var cb callback
    cb = func(s string) {
        println(s)
    }
    cb("hello world")

//演示2
    test(1, 2, func(a, b int) int {return a + b})
}

结果:

代码如下:

hello world
3

(0)

相关推荐

  • 深入解析golang编程中函数的用法

    函数是一组一起执行任务的语句.每Go程序具有至少一个函数,它一般是main(),以及所有的最琐碎程序可以定义附加函数. 你可以将代码放到独立的功能.如何划分代码之间的不同功能,但逻辑上的划分通常是让每个函数执行特定的任务. 函数声明告诉编译器有关的函数的名称,返回类型和参数.一个函数定义提供了函数的实际主体. Go语言标准库提供了大量的内置函数,在程序可以调用.例如,函数len()需要不同类型的参数和返回值的类型的长度.例如,如果一个字符串传递给它,它会返回字符串的长度以字节为单位,如果一个数组

  • golang 函数以及函数和方法的详解及区别

    golang 函数以及函数和方法的区别 在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西.官方的解释是,方法是包含了接收者的函数.到底什么意思呢. 首先函数的格式是固定的,func+函数名+ 参数 + 返回值(可选) + 函数体.例 func main() { fmt.Println("Hello go") } 在golang中有两个特殊的函数,main函数和ini

  • golang struct扩展函数参数命名警告解决方法

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.com/zsy619/gcommon" ) //ChunkFooter 块Footer type ChunkFooter struct { ChunkDataTotalSize int } //NewChunkFooter 创建一个ChunkFooter func NewChunkFooter(chu

  • Golang记录、计算函数执行耗时、运行时间的一个简单方法

    先写一个公共函数, 比如在 common 包下有这么一个方法: // 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time.Time, timeLimit float64) { dis := time.Now().Sub(start).Seconds() if dis > timeLimit { log.Warning(log.CENTER_COMMON_WARNING, tag, " detailed:&quo

  • golang中strconv.ParseInt函数用法示例

    本文实例讲述了golang中strconv.ParseInt函数用法.分享给大家供大家参考,具体如下: golang strconv.ParseInt 是将字符串转换为数字的函数,功能灰常之强大. 参数1 数字的字符串形式 参数2 数字字符串的进制 比如二进制 八进制 十进制 十六进制 参数3 返回结果的bit大小 也就是int8 int16 int32 int64 func ParseInt(s string, base int, bitSize int) (i int64, err erro

  • golang模板template自定义函数用法示例

    本文实例讲述了golang模板template自定义函数用法.分享给大家供大家参考,具体如下: golang的模板十分强大,其中的unix管道风格函数调用很是喜欢. 模板中有很多内置可以参看pkg文档, 另外还可以实现自定义函数. 例子如下: 复制代码 代码如下: package main import (     "text/template"     "time"     "os" ) type User struct {     Usern

  • Golang的os标准库中常用函数的整理介绍

    os.Rename()这个函数的原型是func Rename(oldname, newname string) error,输入的是旧文件名,新文件名,然后返回一个error其实这个函数的真正实现用的syscall.Rename()然后通过MoveFile(from *uint16, to *uint16) (err error) = MoveFileW来重新命名 复制代码 代码如下: import (  "fmt"  "os" ) func main() {  e

  • Golang学习笔记之安装Go1.15版本(win/linux/macos/docker安装)

    安装Go1.15版本 大纲 Windows安装GoLinux安装GoMacOS安装GoDocker安装Go总结 视频地址:https://www.bilibili.com/video/BV14a4y177XG?p=3 Windows安装Go 1.点击下载go1.15版本的msi安装包 64位系统 https://studygolang.com/dl/golang/go1.15.windows-amd64.msi 32位系统 https://studygolang.com/dl/golang/go

  • Golang学习笔记(五):函数

    函数 Go语言里面的核心设计,通过关键字func来声明 复制代码 代码如下: func funcName(input type1, input2 type2) (output1 type1, output2 type2) {     //logical code     return value1, value2 } 基本语法 1.语法 复制代码 代码如下: //一般函数 func func_name(a int) {     println(a) } //多参数,无返回值 func func_

  • Golang学习笔记之延迟函数(defer)的使用小结

    golang的defer优雅又简洁, 是golang的亮点之一.defer在声明时不会立即执行,而是在函数return后,再按照先进后出的原则依次执行每个defer,一般用于释放资源.清理数据.记录日志.异常处理等. 关键字defer于注册延迟调用.这些调用直到 ret 前才被执行,通常用于释放资源或错误处理. 一.当defer被声明时,其参数就会被实时解析 func a() { i := 0 defer fmt.Println(i) //输出0,因为i此时就是0 i++ defer fmt.P

  • Javascript学习笔记之函数篇(五) : 构造函数

    Javascript 中的构造函数与其他语言相比也是不同的.任何通过关键字 new 调用的函数都可以当做构造函数. 在构造函数体内,this 指向新创建的对象.如果构造函数体内没有显示的 return 表达式,那么我们就默认返回 this,也就是新建的对象. 复制代码 代码如下: function Foo() {     this.bla = 1; } Foo.prototype.test = function() {     console.log(this.bla); }; var test

  • Golang学习笔记(一):简介

    Go语言最主要的特性 复制代码 代码如下: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 高性能/高效开发 安装 安装说明 地址 http://golang.org/doc/install 包下载 地址 https://code.google.com/p/go/downloads/list 确认是否安装成功 复制代码 代码如下: go version //查看版本 环境变量设置 整体目录结构 通过package组织,只有packa

  • Javascript学习笔记之 函数篇(二) : this 的工作机制

    全局作用域下 this; 当在全局作用域中使用 this,它指向全局对象. 这里详细介绍下全局对象: 全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象: 这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻. 全局对象初始创建阶段将 Math.String.Date.parseInt 作为自身属性,等属性初始化,同样也可以有额外创建的其它对象作为属性(其可以指向到全局对象自身).例如,在 DOM 中,全局对象的 win

  • Javascript学习笔记之 函数篇(三) : 闭包和引用

    Javascript 中一个最重要的特性就是闭包的使用.因为闭包的使用,当前作用域总可以访问外部的作用域.因为 Javascript 没有块级作用域,只有函数作用域,所以闭包的使用与函数是紧密相关的. 模拟私有变量 复制代码 代码如下: function Counter(start) {     var count = start;     return {         increment: function() {             count++;         },      

  • php学习笔记之 函数声明

    复制代码 代码如下: <?php /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的可维护性 * 3.可以提高开发效率 * 4.提高软件的可靠性 * 5.控制程序的复杂性 * * 函数的声明 * function 函数名(){ * * } * * function 函数名(参数1,参数2,参数...) * { * 函数体 * } * * funct

  • Python学习笔记之函数的参数和返回值的使用

    01.函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以相互结合,共有四种: 无参数 无返回值 无参数 有返回值 有参数 无返回值 有参数 有返回值 定义函数时候,是否接收参数,或者时候返回结果,是根据实际功能需求决定的. 如果函数内部处理的数据不确定,就可以将外界的数据以参数形式传递到函数内部. 如果希望一个函数执行完成后,向外界汇报执行结果,就可以增加函数的返回值. 02.函数的返回值-进阶 在程序开发中,有时候,会希望一个函数执行结束后,告诉调用者一个结果,以便调用者针

  • Golang学习笔记(四):array、slice、map

    一.Array 在Go语言中,数组是一个值类型(value type) 所有的值类型变量在赋值和作为参数传递时都将产生一个复制动作 如果作为函数的参数类型,则在函数调用时参数发生数据复制,在函数体中无法修改传入数组的内容 数组相等用 = != 比较,不能用 < > 1.声明&赋值 初始化 语法 复制代码 代码如下: var VarName [n]type     // n>=0 e.g. var a [5]int //[0 0 0 0 0] var c [2][3]int //二

随机推荐