go中的函数

【Go】一文彻底搞明白Go语言中的函数 在Go语言中,函数(Function)是基本的代码块,用于执行特定的任务,并通过输入参数和返回值与外部环境进行交互。 函数是一段具有特殊功能的、可重用的语句组。(将代码封装起来) 特点:可以反复调用,提高代码的复用性,提高开发效率,便于维护管理 阅读详情

demo1:函数的几种定义方式

package main

import (
    "errors"
    "fmt"
)

/*
函数的用法
跟其他语言的区别:支持多个返回值


*/

//函数定义方法1
func add(a, b int) int {
    return a + b
}

//函数定义方法2
func add2(a, b int) (sun int) {
    sun = a + b
    return sun
}

//函数定义方法3:返回多个值
func div(a, b int) (int, error) {
    var err error
    var result int
    if b == 0 {
        err = errors.New("除数不能为0")
    } else {
        result = a / b
    }
    return result, err
}

func main() {
    res, err := div(12, 3)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }

}

demo2: 参数传递的几种方式

package main

import "fmt"

/*
函数的用法
省略号参数用法1:
当有不定个值需要传入函数时,可以使用省略号。

省略号参数用法2:
用slice实现


*/

//方法1
func add3(a ...int) (sum int) {
    for _, v := range a {
        sum += v
    }
    return
}

//方法2
func add4(a []int) (sum int) {
    for _, v := range a {
        sum += v
    }
    a[0] = 9
    return
}

//方法3

func main() {
    /*
        方法1
        fmt.Println(add3(1, 2))
        fmt.Println(add3(1, 2, 3))
        fmt.Println(add3(1, 2, 3, 4))
    */

    /*
        方法2
        slice1 := []int{1, 2}
        fmt.Println(slice1)
        fmt.Println(add4(slice1))
        fmt.Println(slice1) //可以发现调用完函数后,slice1的值发生变化,因为传递的是引用类型的参数
    */
    arr := [...]int{1, 2, 3}
    fmt.Printf("%T", arr) // 数组类型
    fmt.Println()
    arr2 := []int{1, 2, 3}
    fmt.Printf("%T", arr2) // 切片类型

}

demo3:函数作为变量的值或参数

1、函数可以当做其他变量的值

2、函数可以作为参数传递给其他函数

package main

import "fmt"

/*
函数的用法
1、函数当做值赋值给其他变量

2、函数作为参数传递给其他函数

*/

type sub func(a, b int) int

func filter(score []int) []int {
    res := make([]int, 0)
    for _, v := range score {
        if v >= 60 {
            res = append(res, v)
        }
    }
    return res
}

//  将函数作为参数传递给其他函数
func filter2(score []int, f func(int2 int) bool) []int {
    res := make([]int, 0)
    for _, v := range score {
        if f(v) {
            res = append(res, v)
        }
    }
    return res
}

func main() {

    /*
        函数当做值赋值给其他变量实现
        res := func(a, b int) int {
            return a + b
        }(1, 2)
        fmt.Println(res)
        fmt.Println(res + 3)
    */

    var mySub = func(a, b int) int {
        return a - b
    }
    fmt.Println(mySub(1, 2))

    score := []int{10, 50, 70, 80, 95}
    fmt.Println(filter(score))

    //方法filter2调用
    fmt.Println(filter2(score, func(a int) bool {
        if a >= 60 {
            return true
        } else {
            return false
        }
    }))

}

defer使用

demo

package main

import "fmt"

/*
defer的使用
go语言中,没有try...expect...finally机制,是用defer机制处理
注意:defer之后只能是函数调用,不能是表达式。

一些应用的场景:
·文件的打开和关闭
·数据库连接的开启和关闭
·线程锁的获取和释放
·事务锁的添加和释放

defer的本质是注册了一个延迟函数,
*/

func f() int {
    x := 10
    defer func() {
        fmt.Println(x) //此处的x是外部的x,实际上就是闭包
    }()
    x++
    return 13
}

func main() {

    /*面对异常defer依然执行
    fmt.Println("test1")
    defer fmt.Println("defer test")
    panic("error")
    fmt.Println("test2")
    */

    /*
        多个defer语句执行顺序是逆序的,遵循先进先出原则
        fmt.Println("test")
        defer fmt.Println("defer test1")
        defer fmt.Println("defer test2")
        defer fmt.Println("defer test3")
    */

    /*
        最终只会输入结果:test1  因为defer执行时候的拷贝机制
        test := func() {
            fmt.Println("test1")
        }
        defer test()
        test = func() {
            fmt.Println("test2")
        }

    */

    /*
        下面这段最终输出结果为10而不是11,这跟拷贝机制有关
        x:=10
        defer func(a int) {
            fmt.Println(a)
        }(x)
        x++

        下面这段最终输出结果为11
        x := 10
        defer func(a *int) {
            fmt.Println(*a)
        }(&x)
        x++

        下面这段最终输出结果为11
        x := 10
        defer func() {		//匿名函数
            fmt.Println(x)
        }()
        x++
    */

    //调用f(),这里输出结果为11,13,说明defer是在return之前执行
    fmt.Println(f())
}

代码详解——Transformer 对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。 阅读详情

相关推荐

Linux-RGMII PHY 88E1512 驱动调试记录

1. 简介 1)开发板平台:创龙 AM5728 (tl5728-easy-evm) 2)PHY芯片:Marvell 88E1512 88E1512和88E1510都是一个系列的phy,采用marvell的通用phy驱动,驱动源码路径如下:drivers/net/phy/marvell.c 2. 应用场景 1)系统框图 AM5728连接两个PHY,PHY0的工作模式是 RGMII to Copper (RGMII到电口),PHY1的工作模式是 RGMII to SGMII。 两个PHY与处理器的连接方式都是

weixin_40407893的博客 2万+

GoLang之defer底层系列一(v 1.12)

GoLang之defer底层系列一(v 1.12)

weixin_52690231的博客 627

【STM32】从零构建串口IAP框架:BootLoader与App双向跳转实战解析

本文详细解析了STM32串口IAP框架的构建,重点阐述了BootLoader与App双向跳转的实战原理与实现步骤。内容涵盖Flash分区规划、中断向量表重定向、通信协议设计及固件升级流程,并针对跳转失败、程序跑飞等常见问题提供了解决方案,帮助开发者掌握产品级远程升级的核心技术。

wind6的博客 838

go语言之defer陷阱-指针参数

在第一段代码段中,循环初始时声明了i变量,在之后的循环中i变量的地址固定不变,改变的只是i的内容,因此传递给defer的参数&i(i的地址)都是同一个,地址指向的结果都是一样的,所以结果打印的都是最后一个i的内容,也是同一个。在第二段代码中,每次循环都会重新定义一个变量x,所以x的地址是会改变的,x地址指向的内容是此次循环中i的值,所以传递给defer中的参数&x(x的地址)都是不一样的,地址指向的值也是不一样的,所以打印结果不一样。可以看到,两个代码段唯一的区别就是第二段代码多了一行。

qq_51145046的博客 229

GCC调试黑科技:-fomit-frame-pointer优化下如何保证栈回溯能力

本文深入探讨了GCC编译器在启用`-fomit-frame-pointer`优化选项时如何保证栈回溯能力。通过分析`.eh_frame`段的结构与DWARF调试信息,提供了从编译选项配置到实战调试的完整解决方案,帮助开发者在性能优化与调试能力之间找到最佳平衡点。

u6v7w8x的博客 904

全国充电站分布数据

CnOpenData推出的充电站数据覆盖全国34个省份的3万条数据,包含充电站名称、省份名称、省份代码、商圈、经纬度等地理信息以及商业类型、评分、消费等衍生信息,能为城市规划、环境科学、市场分析、技术发展和社会经济研究等多个领域提供宝贵的数据支持。

Sunny9qx的博客 4023

Go的defer使用心得

作用:defer的引入,为了在函数执行完毕后及时释放资源,当然有时候也用来处理意外退出的后续工作 说明: 1.当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈), 2.当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行 3.defer将语句入栈时,也会将语句相关的值进行拷贝,同时入栈 注意:此操作是复制了一份值的副本而不是引用 实例代码: func sum(n1 int, n2 int) int { //defer 后边的会在该函数执行完成后再执行 d

QiuHaoqian的博客 579

数据标注的下一代SOP,可能不是Word,而是一段Prompt

再给几个反例:“这个只是正常纹理,不算。真正用于数据生产的Prompt,可能至少包含:任务定义、正例、反例、边界案例、优先级、输出格式、验收逻辑。一个项目100个人,如果100个人对这句话有100种理解,最后返工的就不是一个框,而可能是几十万帧数据。一个项目启动以后,项目经理先研究SOP,培训组长,组长再培训标注员,最后几百个人按照同一套规则干活。实际上一个成熟的项目经理,最重要的能力之一,就是:把客户的业务语言翻译成生产规则。真正让项目难交付的,从来不是80%的普通数据,而是那20%的长尾数据。

AI数据标注猿 293

Go学习随笔(八)函数参数传递机制\defer和跟踪语句

函数传递机制 func add(a int) int { a++ return a } func addo(a *int) int { *a++ return *a } func main() { x := 3 fmt.Println("x=", x, " &x=", &x) y := add(x) //执行add实际上修改的是x的副本 fmt.Pri...

Fighting社火底子 713

HotSpot G1 GC 的分区记账、SATB 并发标记与停顿目标调优解析

线上GC毛刺该调停顿目标、加大新生代还是换收集器?本文从HotSpot G1的设计出发,梳理分区与巨型对象、卡表与记忆集、写屏障与细化线程、停顿预测、SATB并发标记、自适应IHOP、混合回收规则及Full GC兜底,并注明JDK8至JDK27的版本差异。文中在JDK8与JDK17上实测:停顿目标从200ms降到20ms,伊甸区缩小四成、P99下降但仍超目标;巨型对象会反复触发又撤销并发标记;JDK17并行Full GC平均停顿约为JDK8的三成。最后给出日志解读、参数清单、调优流程与选型。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 170万+

从菜鸟到大神:VSCode助力HTML开发全攻略

本文全面介绍 VSCode 在 HTML 开发中的高效应用。先引导读者完成 VSCode 的安装与个性化设置,助其快速适应开发环境;接着推荐 Live Server、Prettier 等实用插件,实现实时预览、代码格式化等功能,提升开发效率。通过详细的开发实战步骤,从新建文件到添加样式,带领读者掌握 HTML 基础结构与常用标签使用。还分享代码片段管理、多人协作等进阶技巧,解决常见开发问题。旨在帮助开发者利用 VSCode,轻松高效完成 HTML 开发,打造优质网页。

邓邓子的博客 3364

golang get url传参_Golang之defer

defer 关键字是 Golang 引入的特征关键字之一,方便开发者做开发,在某些场景真的是太方便了,可以少写很多重复的代码。比如在错误处理场景,如果有多次返回,资源清理工作可能就是重复的。常规方式:func FileProcess() (msg string, err error) { f, err := os.Open("demo-file-name") if err != ni...

weixin_35117321的博客 799

keras tensorflow 的lstm的新冠疫情感染人数预测 附完整代码数据 可直接运行

keras tensorflow 的lstm的新冠疫情感染人数预测 附完整代码数据 可直接运行

847

golang延时_关于go 语言中的延迟执行函数

许多内置的带有返回值的函数无法进行延迟调用在go语言中,调用自定义函数的结果值可以全部不存在(丢弃)。但是,对于具有非空白返回结果列表的内置函数,他们的调用的结果不可以抛弃,copy和recover例外。 换句话说,延迟执行函数的结果必须被抛弃,所以许多内置函数无法被延迟。幸运的是,在实践中,很有偶需要延迟执行内置函数的地方。据我所知,只有append函数可能需要被延迟执行。这种情况下,我们可以把...

weixin_33205735的博客 4395

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

golang中的函数 go语言函数

其中,“函数名”是函数的名称,“参数列表”是以逗号分隔的零个或多个参数,每个参数由参数名称和参数类型组成;需要注意的是,函数名、参数列表和返回值列表都是可选的。在Golang中,函数是一个独立的代码块,它可以接受输入参数并返回一个或多个值。调用函数时,可以将实参传递给函数,并使用函数的返回值。这个函数有两个参数(x和y,都是int类型),返回一个int类型的值,函数体中使用加法运算符计算两个数之和并返回结果。在这个例子中,调用add函数时传递的参数为3和5,函数返回结果8并存储在变量z中。

m0_61412114的博客 266

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

golang中的函数

go语言顺序编程(过程式编程)中的基本语法概念,本次再此基础上介绍函数的概念,函数是包含用执行某一任务或者计算的系列语句,通过一系列语句的包装,使其更便于阅读,是使其更加简单明,清晰便捷。 main函数是程序的入口,而且因为go语言是编译型语言,所以函数编写的顺序是无关紧要的,但是为了可读性,最好吧main函数写在文件的前面,其他函数按照一定的逻辑顺序进行编写, 对于熟悉java或者其他编程语言的读者来说,对于函数和方法可能有些误解,go语言中,函数和方法不一样,有明确的区别,但对java而言,一般可以

ens160的博客 161

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Go】Go语言中的 Init 函数和 main 函数

文章目录一、init 函数1. init 函数的作用2. init 函数的特征3. 多个 init 函数的执行顺序4. Go 程序的初始化二、main 函数三、init 函数和 main 函数的异同四、实例实例一实例二实例三实例四实例五实例六实例七参考链接 一、init 函数 1. init 函数的作用 go语言中的 init 函数用于包(package)的 初始化 ,该函数是go语言的一个重要特性。 主要作用是: 初始化 不能采用初始化表达式 初始化的变量。 程序运行前的注册。 实现sync.Once

weixin_44211968的博客 2681

2011年06月30日 Go生态洞察:Go中的一等函数

嘿,猫头虎博主今天要介绍的是Go语言中令人惊喜的一等函数特性。🔍 Go不仅支持函数类型,还允许将函数作为值处理,并且支持闭包。这些特性为Go带来了灵活性和强大的表达能力。如果你对Go的函数特性好奇,无论是新手还是老手,都会在这篇文章中找到乐趣。特性描述函数类型Go允许声明函数类型,使函数签名成为类型系统的一部分。函数值函数可以作为值赋给变量,或者作为其他函数的参数和返回值。闭包函数可以捕获创建时作用域中的变量,形成闭包。Go的一等函数特性为语言带来了巨大的灵活性和表现力。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 1万+

【Go语言】Go语言中的函数

Go语言默认使用按值传参来传递参数,也就是传递参数值的一个副本,函数收到传递进来的参数后,会将参数值拷贝给声明该参数的变量(也叫做形式参数,简称形参),如果在函数体中有对参数值做修改,实际上修改的是形参值,这不会影响到实际传递进来的参数值(也叫实际参数,简称实参)。如果需要实现在函数中修改形参值的同时改变实参,需要引用传参来实现,此时传递给函数的参数是一个指针,而指针代表的是实参的内存地址,修改指针引用的值即修改变量内存地址中存储的值,因此实参的值也会被修改。指引用了外部函数作用域中的变量的函数。

Python、Golang、大数据 2788

go 函数名之前括号中的内容_Golang教程之函数篇(四)

本篇主要介绍Golang里面的函数、方法以及接口。 首先,说一下函数(function)和方法(method)的区别?其实长的都一样,只不过方法是属于某个对象(或结构体),只有对象自己能调用,而函数则像是公共的,谁都可以调用。1.函数(function)在Go里面,函数是一等公民,main函数就是Go程序的执行入口,但是main函数无法被调用。Go里面函数不仅仅可以被调用,而且还可以当作一种类型,...

weixin_42133969的博客 1188

彻底搞懂 Golang 中的函数

Golang 中的函数定义由关键字 func 开始,后面跟上函数名、参数列表和返回值列表。// 函数体functionName:函数名称,用于标识该函数。parameterList:函数接受的参数列表,参数之间使用逗号分隔。如果没有输入参数,则使用空的括号。returnParameterList:函数返回的参数列表,参数之间使用逗号分隔。如果没有返回参数,不写即可。函数体:包含实现函数功能的代码块。函数可以接受零个或多个输入参数。这些参数在函数定义时指定,并在函数调用时传递。

路多辛的所思所想 571

关于Go语言中的函数方法

关于Go语言中的函数方法方法是什么函数和方法的区别Go中的“多态” 方法是什么 func (recv receiver_type) methodName(parameter_list) (return_value_list) { … } 在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢? 在 Go 中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数

面向生活编程 741

golang中的init函数以及main函数

以下内容转载自https://www.cnblogs.com/TimLiuDream/p/9929934.html golang中的init函数以及main函数 首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次。 main函数 main 函数只能在package main中。 执行顺序 golang里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于p..

Shanks 316

go语言如何调用其他包中的函数

go语言如何调用其他包中的函数

qq_54650406的博客 3726

golang中的接口、函数、方法

For-learning-Go-Tutorial Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。 因而一直想的是自己可以根据自己学习和使用Go语言编程的心得,写一本Go的书可以帮助想要学习Go语言的初学者快速入门开发和使用! 在 Golang 中,interface 是一个非常重要的概念和特性。 接口(Interface) 在Go语言中,函数和方法不太一样,有明确的概念区分。

ccf19881030的专栏 1010

Go 语言中的一等函数

支持一等函数的编程语言允许将函数赋值给变量、作为参数传递给其它函数及从其他函数返回。 Go 支持一等函数。我们将讨论一等函数的语法和各种用例。让我们从一个将函数分配给变量的简单示例开始。 在上面的程序中,在第8行中为变量赋值了一个函数。这是将函数赋值给变量的语法。如果仔细注意,被赋值给的函数没有名称。这些类型的函数称为匿名函数,因为它们没有名称。调用此函数的唯一方法是使用变量 。已经在下一行完成了这项工作。a() 调用该函数,这将打印 。 在第12行 我们变量 的类型。 这将打印 。运行此程序将打印 也可

HHFQ的博客 284
上一篇: 字符串操作
下一篇: suricata安装与配置
Cc_sec
博客等级 码龄8年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值