首页
学习
活动
专区
圈层
工具
发布

深入理解go的函数参数传递

首先我们要有一个理解:go的函数参数传递都是值传递,为什么说是传值呢?因为go的函数传递都是复制了一份传递到参数中。...,函数的参数地址都变化了,参数地址指向的内容是原来的值。...所谓值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。但是其实go里面有些类型会影响到实际参数,下面我们对不同的类型来不同的讲解。...关于d呢,原因和c是一样的,makechan会返回一个指针,函数内操作其实就是直接对传过来的变量的属性进行更改了,所以函数内操作直接修改了实参。...---- 下面我们过一下这个创建的函数的源码,以上的实例分析希望对大家有帮助,有问题随时交流。

2.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Go语言:理解函数、方法和指针

    在Go语言中,函数和方法都是可执行的代码块,但它们有一个重要的区别:函数是独立的,而方法是依赖于特定类型的。此外,Go语言还对方法接收者的类型(值类型或指针类型)有独特的处理,这是本文的重点。...我们将以详细的代码示例来揭示这些概念。 函数 vs 方法 函数 函数是独立的代码块,可以直接通过它的名称来调用,不依赖于特定的类型。...我们在 setValue 方法中更改了 ms.Val 的值,所以在 main 函数中,ms.Val 的值变成了 10。 Go中的指针省略 Go语言允许在某些情况下省略指针。...(&ms2).setValue(10) fmt.Println(ms2.Val) // 输出:10 } 总结一下,Go语言的函数和方法是执行代码的两种基本方式。...理解这两者的区别和如何使用是学习Go语言的一个重要步骤。同时,理解值接收者和指针接收者之间的差别,以及Go如何处理这些情况,也是非常关键的。希望本文对你有所帮助,让我们一起更深入地学习Go语言。

    31210

    从栈上理解 Go语言函数调用

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/518 本文使用的go的源码 1.15.7 前言 函数调用类型 这篇文章中函数调用...(Function Calls)中的函数指的是 Go 中的任意可执行代码块。...我们先来看看 plan9 的汇编函数的定义: 汇编函数 我们先来看看 plan9 的汇编函数的定义: [function] stack frame size:包含局部变量以及额外调用函数的参数空间;...0x0043 00067 (main.go:9) RET 通过上面的分析相信大家应该都能看懂这段汇编是在做什么了,匿名函数实际上传递的是匿名函数的入口地址。...调用完毕之后会回到 main 函数中,这个时候的栈帧如下: [call stack10] 下面再回到 main 函数的 test 函数调用后的位置: 0x0020 00032 (main.go:11)

    2.9K30

    Go:深入理解reflect.DeepEqual函数

    引言 在Go语言中,reflect包提供了一套功能强大的工具来检查、操作和修改程序的运行时表示。reflect.DeepEqual是reflect包中的一个重要函数,它用于判断两个值是否深度相等。...深入理解reflect.DeepEqual reflect.DeepEqual函数的比较逻辑如下: 基本类型:直接比较值是否相等。 数组:比较每个元素是否相等。...函数比较:如果结构体或容器中包含函数,reflect.DeepEqual不会比较函数逻辑是否相同,只会比较函数指针是否相等。...,但reflect.DeepEqual比较的是函数的指针,因此返回false。...结论 reflect.DeepEqual是一个功能强大的工具,适用于多种复杂数据结构的比较。了解其工作原理和局限性,能帮助开发者在Go语言中更高效地进行数据比较和验证。

    99910

    Go 跟踪函数调用链,理解代码更直观

    Go 跟踪函数调用链,理解代码更直观 一、引入 defer 是 Gopher 们都喜欢的语言机制,除了捕捉 panic、延迟释放资源外,我们日常编码中还有哪些使用 defer 的小技巧呢?...那么如何实现 Trace 函数对它跟踪函数名的自动获取呢?我们需要借助 Go 标准库 runtime 包的帮助。...文件中,我们用 ExampleXXX 形式的函数表示一个示例,go test 命令会扫描 example_test.go 中的以 Example 为前缀的函数并执行这些函数。...── ast.go │ └── instrumenter.go └── trace.go 我们先来看一下 cmd/instrument/main.go 源码,然后自上而下沿着 main 函数的调用逻辑逐一看一下这个功能的实现...Instrument 首先通过 go/parser 的 ParserFile 函数对传入的 Go 源文件中的源码进行解析,并得到对应的抽象语法树 AST,然后向 AST 中导入 Trace 函数所在的包

    73940

    如何理解 Go函数是一等公民

    在接触Go这么语言,可能你经常会听到这样一句话。Go语言中,函数属于一等公民,你可能很费解,什么是一等公民。是因为函数的优先级很高吗?如果是又是怎样的优先级呢?...本文将分享Go语言中函数是一等公民的真正面纱。 什么是函数 在了解一等公民之前,先普及一下函数基础知识。...(返回类型...) { return 返回值... } 在Go语言中,函数可以分配给一个变量,可以作为函数的参数,也可以作为函数的返回值。这样的行为就可以理解为函数属于一等公民。...我们调用第 13 行中的函数并将结果分配给s变量。将打印结果: Sum 11 函数作为参数 在Go语言中,也是支持将函数作为另外一个函数的参数进行传递。...函数作为返回值 在Go语言中,也可以将函数作为另外一个函数的返回值进行传递。

    56810

    Go 堆栈的理解

    它也显示了代码所在的文件和路径,以及debug.PrintStack()发生的行数(第10行)。 第八行 也调用Example的函数的名字,它是main package的main函数。...它也显示了文件名和路径,以及调用Example函数的行数。...当你比较函数的声明以及传递的值时,发现它们并不一致。函数声明只接收三个参数,而堆栈中却显示6个16进制表示的值。理解这一点的关键是要知道每个参数类型的实现机制。...第二个值得注意的是堆栈信息中方法的第一个参数为receiver的值。方法调用总是转换成函数调用,并将receiver的值作为函数的第一个参数。我们可以总堆栈信息中看到实现的细节。...如果可能,Go编译器将为该函数的堆栈帧中的函数分配本地变量。但是,如果编译器在函数返回后无法证明变量未被引用,则编译器必须在垃圾收集堆上分配变量以避免悬空指针错误。

    1.7K20

    哈希函数的理解

    前言 什么是哈希函数?它能用来干嘛?本文将以图文的形式讲解上述问题,欢迎各位感兴趣的开发者阅读本文。 概念与作用 哈希函数可以把给定的数据转换成固定长度的无规律数值。...转换后的无规律数值可以作为数据摘要应用于各种各样的场景。 图解示例 我们可以把哈希函数想象成搅拌机,如下图所示。 将数据放进搅拌机里 经过哈希函数计算后,搅拌机会输出固定长度的无规律数值。...哈希函数的特征 哈希值的长度与输入数据的大小的无关 输入相同数据,输出的哈希值也必定相同 输入相似的数据,输出的哈希值必定不同。 输入的数据完全不同,但输出的哈希值可能是相同的。...哈希函数的作用 哈希函数的算法中具有代表性的是「MD5」、「SHA-1」、「SHA-2」等,其中SHA-2是现在应用较为广泛的一个,而MD5和SHA-1存在安全隐患,不推荐使用。...不同算法计算方法不同,计算出来的哈希值也会有所不同。哈希函数的特征中有一条是输入的数据相同,输出的哈希值也必定相同,这个特征的前提是使用的是同一种算法。

    1.1K50

    GO 语言的函数??

    要了解 GO 语言中程序的初始化顺序,就要先明白整个程序初始化流程中,都会涉及到哪一些内容 GO 语言中以包 package 作为 程序逻辑封装的基本单元,每一个包我们可以理解为他是独立的,封装良好的,...demo 仓库可以查看如下地址: GO 语言程序初始化顺序 demo 函数在 GO 语言中的地位?...在 GO 中,我们可以看到没有那些高级语言面向对象的语法,例如 Class 类,继承,对象等等内容, GO 语言中可以通过函数或者方法的方式进行各种组合完成我们想做的一切事项 此处就体现了函数在 GO...语言中是极其的重要,函数在 GO 语言中是 一等公民 的存在。...playfootball 函数 GO 语言中的 defer 使用过 GO 语言的 xdm 对于 defer 不会陌生,对于那些我们需要在函数退出前释放或者需要关闭的资源,我们就可以使用到 defer

    31810

    理解Go语言的nil

    查一下词典可以知道,nil的意思是无,或者是零值。零值,zero value,是不是有点熟悉?在Go语言中,如果你声明了一个变量但是没有对它进行赋值操作,那么这个变量就会有一个类型的默认零值。...Go的文档中说到,nil是预定义的标识符,代表指针、通道、函数、接口、映射或切片的零值,也就是预定义好的一个变量: type Type int var nil Type 是不是有点惊讶?...nil并不是Go的关键字之一,你甚至可以自己去改变nil的值: var nil = errors.New("hi") 这样是完全可以编译得过的,但是最好不要这样子去做。...,除了不能索引外,其他的操作都是可以的,当你需要填充值的时候可以使用append函数,slice会自动进行扩充。...do函数声明了一个*doErro的变量err,然后返回,返回值是error接口,但是这个时候的Type已经变成了:(*doError,nil),所以和nil肯定是不会相等的。

    2K72

    Go Reflect 理解

    最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用,虽然反射的机制大多数语言都支持,但好像都没有go一样这么依赖反射的特性。...个人觉得,reflect使用如此频繁的一个重要原因离不开go的另一个特性,空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。...另外,虽然反射大大增加了go语言的灵活性,但要完全掌握它的原理和使用也还是有一点难度的。...go的reflect库有两个重要的类型: reflect.Type reflect.Value Type,Value分别对应对象的类型和值数据 还有两个重要的函数: reflect.TypeOf(i interface...否则会抛异常 reflect整体不是很好理解,如果要进一步掌握如何使用,以及在什么场景下用,建议看一些开源库的代码,来理解reflect的使用。

    70610

    Go 函数

    函数定义 Go 语言函数定义格式如下: func function_name( [parameter list] ) [return_types] { 函数体 } 以下实例为 max() 函数的代码...引用传递 | 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。...*x = *y /* 将 y 值赋给 x */ *y = temp /* 将 temp 值赋给 y */ } 函数用法 Go 语言函数作为实参 Go 语言可以很灵活的创建函数,并作为另外一个函数的实参...语言函数方法 Go 语言中同时有函数和方法。...C++ 等语言中,实现类的方法做法都是编译器隐式的给函数加一个 this 指针,而在 Go 里,这个 this 指针需要明确的申明出来,其实和其它 OO 语言并没有很大的区别。

    35300

    Go - 函数

    概述 学习了一些基础语法,开始学习写函数了,分享几个自己写的函数。...函数体 // 返回多个值 return value1, value2 } 函数用 func 声明。...函数可以有一个或多个参数,需要有参数类型,用 , 分割。 函数可以有一个或多个返回值,需要有返回值类型,用 , 分割。 函数的参数是可选的,返回值也是可选的。...值传递 传递参数时,将参数复制一份传递到函数中,对参数进行调整后,不影响参数值。 Go 语言默认是值传递。 引用传递 传递参数时,将参数的地址传递到函数中,对参数进行调整后,影响参数值。...这个是 Go - Struct 结构体的例子: //demo_13.go package main import ( "encoding/json" "fmt" ) type Result

    41330

    Go 问答之如何理解 Go 中的接口

    如何理解 Golang 中的接口。个人认为,要理解 Go 的接口,一定先了解下鸭子模型。 鸭子模型 那什么鸭子模型?...Go 接口设计和鸭子模型有密切关系,但又和动态语言的鸭子模型有所区别,在编译时,即可实现必要的类型检查。 什么是 Go 接口 Go 接口是一组方法的集合,可以理解为抽象的类型。...这是一种非侵入式的设计。 我们定义一个函数,负责执行鸭子能做的事情。...,Go 的 interface{} 常常会被作为函数的参数传递,用以帮助我们实现其他语言中的泛型效果。...理解 Go 接口要记住一点,接口是一组方法的集合,这句话非常重要,理解了这句话,再去理解 Go 的其他知识,比如类型、多态、空接口、反射、类型检查与断言等就会容易很多。

    73131

    如何通俗的理解函数的极限_不理解函数极限的定义!

    解释来解释去就是那么死板板的几句话,连他们自己也没有make sense,教师如此,教科书如此,学生也只能以葫芦画瓢,难以彻底理解。 下面尝试一下,看看能不能把问题说清楚。...譬如我们说人的体能极限,人的寿命极限,人的 身高极限,人跑路速…全部 楼主的问题显然是有备而来,是经过严格逻辑分析后有感而发的问题。...解释来解释去就是那么死板板的几句话,连他们自己也没有make sense,教师如此,教科书如此,学生也只能以葫芦画瓢,难以彻底理解。 下面尝试一下,看看能不能把问题说清楚。...因为我们太多的、过多的强调了极限的“限”的含义,我们忽视了极限 的过程,忽视了极限的趋势,我们总是用有限的过程去代替无限的极限过程, 古代文明与西方的齐头并进,就是从这里开始掉队的,迄今我们还是浑然不觉...ε是你给出的,要多小有多小的任意的数。

    1.1K30

    如何理解 Go 中的反射

    The Go Playground Golang 中的反射是基于类型(type)机制的,所以需要重温一下 Golang 中的类型机制。 1....所以综上述两点可得知,Golang 中的反射可理解为包含两个过程,一个是接口值到反射对象的过程,另一个则是反向的反射对象到接口值的过程。 3.3....我们都知道在 Go 中的参数传递都是使用的值传递的方法,即将原有值的拷贝传递,在刚刚的例子中,我们是传递了一个 x 对象的拷贝到 reflect.ValueOf 函数中,而不是 x 对象本身,刚刚的 SetFloat...这里结果输出为: 0: A int = 23 1: B string = skidoo 这里有一点要注意的是,结构体 T 的字段名首字母都是大写,在 Go 中首字母大写的变量或者函数才是可导出的(exported...),相当于 Java 中的 public,而首字母小写的变量或者函数则是包外不可使用,对应 Java 的 protected。

    1.5K50

    python 函数的本质理解

    对于习惯了Java等面向对象语言,可能会对其任何对象都可以用类来表示已经习惯,但是python语言的灵活多变可能让你感到很不习惯,对于很多骚操作很感到吃惊(: 但是其实实际上是不能真正的理解python...中的一切皆对象的概念,当你真正理解其概念后,你才会明白原来python的强大 python 中函数与类都是对象 python 中函数和类,甚至是模块都是对象,函数大部分情况下可以作为类来用,而且都是第一类对象...第一类对象的通用特性: 可作为值传递,赋值给另一个对象; 可以作为元素添加到集合对象中; 可以作为参数传递给其他函数; 可以作为函数的返回值。...函数的闭包 闭包函数就是函数可以读取到与自己不是一个作用域的局部变量 1.必须有一个内嵌函数 2.内嵌函数必须引用外部函数中的变量 3.外部函数的返回值必须是内嵌函数 def fun1(x):...,Python中的函数是最高等级的对象,而不仅仅是一小段代码.

    1.1K10
    领券