非零基础自学Golang 第7章 函数 7.8 知识拓展

news2025/1/21 15:27:23

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第7章 函数
        • 7.8 知识拓展
          • 7.8.1 函数参数传递的本质
          • 7.8.2 Go内置函数

第7章 函数

7.8 知识拓展

7.8.1 函数参数传递的本质

在讲述参数传递前,我们首先要了解两个基本概念:值传递和引用传递。

  • 值传递:将变量的一个副本传递给函数,函数中不管如何操作该变量副本,都不会改变原变量的值。
  • 引用传递:将变量的内存地址传递给函数,函数中操作变量时会找到保存在该地址的变量,对其进行操作,会改变原变量的值。

Go语言函数传入参数时使用的始终是值传递,对于值传递,Go语言主要分为以下两种情况:

  1. 对于int、string和bool等值类型变量,传递的是原变量的副本,对副本的操作不会影响原变量。
  2. 对于指针、切片、map和channel(通道)引用类型变量,传递的是原变量指针的一份副本,该副本指向了原变量地址,因此对该副本的操作会影响原变量,从而达到了其他编程语言中类似于引用传递的效果。

【懂了!】

下面我们通过实例来进行讲解。

[ 动手写 7.8.1 ]

package main

import "fmt"

func passByValue(numPara int) { //值传递参数
   fmt.Printf("passByValue 函数中变量的numPara地址为: %p\n", &numPara)
   numPara = 100
}

func passByReference(numPara *int) { // 引用传递函数
   fmt.Printf("passByReference 函数中指针变量numPara 地址为: %p\n", &numPara)
   fmt.Printf("passByReference 函数中指针变量numPara 指向的地址为: %p\n", numPara)

   *numPara = 100
}

func main() {

   num := 1
   fmt.Printf("main 函数中变量num地址为: %p\n", &num)
   passByValue(num)

   fmt.Printf("num 变量值为: %d\n", num)
   passByReference(&num)

   fmt.Printf("num 变量值为: %d\n", num)
}

运行结果

在这里插入图片描述

从程序执行结果可以发现,num变量在传递到passByReference函数后,其原本的值发生了变化。

原因是其传递的是num变量的地址,该地址经过拷贝后传递给passByReference函数,但是其指向的值为num变量的地址,因此在passByReference函数中的“*numPara = 100”会影响原变量的值。

很清晰

类似地,使用map变量传递的是原变量的指针:

[ 动手写 7.8.2 ]

package main

import "fmt"

func passByReference(mapNumReference map[int]int) {

   fmt.Printf("passByReference 函数中变量mapNumReference地址为: %p\n", mapNumReference)

   fmt.Printf("passByReference 函数中变量mapNumReference 所属指针地址为: %p\n", &mapNumReference)

   mapNumReference[1] = 100
}

func main() {

   mapNum := map[int]int{1: 10}
   fmt.Printf("main 函数中变量mapNum 地址为: %p\n", mapNum)
   fmt.Printf("main 函数中变量mapNum 所属指针的地址为: %p\n", &mapNum)

   fmt.Printf("mapNum 变量值为: %d\n", mapNum)
   passByReference(mapNum)

   fmt.Printf("mapNum 变量值为: %d\n", mapNum)
}

运行结果

在这里插入图片描述

通过map类型变量参数传递的例子我们可以发现,函数进行值传递后拷贝的是map类型变量指针,但拷贝后的指针地址指向的还是map的地址,从而导致在函数passByReference中对map的操作会影响原变量。

7.8.2 Go内置函数

Go语言中自带了很多功能强大的内置函数,这些内置函数的定义都位于builtin.go文件中,使用时直接调用即可。

这里简要列出了Go的所有内置函数及其作用,如下表所示:

在这里插入图片描述

这里以对切片和复数的操作为应用场景,介绍几个Go内置函数及其作用。

我们创建sourceSlice切片,将元素4、5、6追加到该切片中,之后将其复制给targetSlice切片,输出切片的长度和容量。

[ 动手写 7.8.3 ]

package main

import "fmt"

func main() {

   // 将4、5、6追加到 sourceSlice 切片中
   sourceSlice := []int{1, 2, 3}
   sourceSlice = append(sourceSlice, 4, 5, 6)

   fmt.Println("sourceSlice: ", sourceSlice)

   // 将sourceSlice 切片中的元素复制到 targetSlice 切片中
   targetSlice := make([]int, 3)
   num := copy(targetSlice, sourceSlice)

   fmt.Println("复制成功的元素个数为: ", num)
   fmt.Println("targetSlice : ", targetSlice)
   fmt.Println("targetSlice 切片长度为: ", len(targetSlice))
   fmt.Println("targetSlice 切片容量为: ", cap(targetSlice))
}

运行结果

在这里插入图片描述

使用Go语言内置的complex函数可创建复数,并使用real函数和imag函数提取复数的实部与虚部。

[ 动手写 7.8.4]

package main

import "fmt"

func main() {

   c1 := complex(1, 2)
   fmt.Println(c1, "实部为: ", real(c1))
   fmt.Println(c1, "虚部为: ", imag(c1))
}

运行结果

在这里插入图片描述

可以看到,在许多情况下,使用Go语言的内置函数可解决开发中的许多实际问题,避免自己使用代码重复实现相关逻辑。

【Go 66666】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API接口DTO测试数据构造的一个方式

自动化测试中,经常需要构造请求参数,例如JSON格式的参数,简单的好说,可以手工修改或是用 Postman、Jmeter 等工具结合简单的代码进行处理, 但当数据传输对象(DTO)很复杂,部分字段依赖…

同样是项目经理,为啥就干不过他?

早上好,我是老原。 很多人和我抱怨说,做工作太难了,领导针对我,同样都是项目经理,就老是挑我的刺,找我的麻烦。 其实在我看来,工作其实没有那么难,80%的工作问题,都是沟…

C#语言实例源码系列-虚拟键盘

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

guitar pro8吉他谱软件好用吗?2023GTP全新功能解析

我们常见的GTP格式吉他谱就是用这款软件制作出来的曲谱,也只能用这款软件打开查看。看介绍感觉还不错,原生支持Apple的芯片了。这也是一款能陪着我们一起进步,提升自己的软件。我们在练习吉他等乐器的过程中,音阶与和弦的熟练掌握…

ffmpeg-AVBuffer、AVBufferRef、引用计数机制

目录 引用计数 定义 优点 AVBuffer AVBufferRef av_buffer_create av_buffer_ref av_buffer_unref 参考: 引用计数 定义 引用计数是一种内存管理的方式,当一份内存可能被多个对象使用,可以通过引用计数的方式实现内存复用。 优点 …

深入理解Maven的各项配置

深入理解Maven的各项配置1. Introduction1.1 Big Data -- Postgres2. Install2.1 Maven Install2.2 Config Setting.xml2.3 Local Package Install Maven3. Project4.AwakeningMaven Document: https://maven.apache.org/. Maven Download: https://maven.apache.org/download.…

基于微信小程序的好物分享系统ssm框架-计算机毕业设计

项目介绍 我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,好物分享系统小程序被用户普遍使用,为方便用户…

【技术应用】mybatis数据库操作(insert、update、delete)返回值为0的场景

【技术应用】mybatis数据库操作insert、update、delete返回值为0的场景一、前言二、数据库异常处理三、insert操作返回值为: 0四、update操作返回值为: 0五、delete操作返回值为: 0六、总结一、前言 最近在review项目组成员代码时,发现代码中有很多mybatis执行数据…

涉及准考证相关需要关注的一系列问题,涉及防疫、考点信息、计算器等内容

12月14日起可以打印准考证!这是一件操作并不复杂的工作,但打印下来以后可能会遇到一些细节问题,对此我们梳理出来供大家参考,有则改之,无则更好! 1.有关省份个人健康申报表等如何填写?如您报考点…

web网页设计期末课程大作业:美食餐饮文化主题网站设计——美食汇5页HTML+CSS+JavaScript

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

事业编招聘:南方科技大学附属实验学校2022年·面向应届毕业生招聘在编教师公告

南方科技大学是在中国高等教育改革发展背景下创建的一所高起点公办创新型大学,2022年2月14日,教育部等三部委公布第二轮“双一流”建设高校及建设学科名单,南方科技大学入选“双一流”建设高校名单。 南方科技大学附属实验学校,地…

部署了一个个人博客(好歹服务器不是闲着了)

界面前台界面展示(给到浏览用户)后台界面展示(简单介绍)技术说明前台界面展示(给到浏览用户) 肯定首先将界面展示一下。声明一下这个不是我原创的界面,当然这个是可以改造的。这个在安全上还有…

血氧仪的分类与价格区别

有没有发现最近血氧仪、额温枪、壁挂式测温仪又开始火了?并且市场活跃度越来越高。而作为我们血氧仪方案提供商或者生产企业来说,您是不是和优优一样会时常听到客户发出如下反馈: “我刚问了另外一家,和你这个样子差不多的&#…

VC++2010中使用MSDN library 200X版本

前言 以前一直用VS2005 ,帮助文档调用很方便,现在要使用VS2010版本来写程序,这个帮助文档真是不方…… 自己写了一个F1的按键助手,这下我可 以使用VS2008中的帮助文档了,虽然帮助低一个版本,但是写C程序,…

七个步骤覆盖 API 接口测试

接口测试作为最常用的集成测试方法的一部分,通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期,有些情况是功能测试无法覆盖的,所以接口测试是非常必要的。首先需要对接口测试的基本信息做一些了解&#…

阿里面试题库被“泄露“导致多人进大厂,惨遭多家大厂威胁下架

我有一个玩得特别好的朋友找我帮忙,说他儿子去大厂面试几次没刷下来,要求我帮他儿子出出主意,大概了解他儿子的情况后,我就给他推荐了这本软件测试10万总结,大概过了几个月他就给我发信息了,说他已经靠这份…

(一) Oriented R-CNN

文章目录0.基础介绍1.旋转框的中点偏移表示法2.Oriented R-CNN架构2.1 Oriented RPN2.2 Rotated RoI Alignment参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 论文:Oriented R-CNN for Object Detection 代码&#xf…

Erlang - 入门之一日志系统如何打印输出使用lager框架

在合适的地方插入一句代码即可: lager:error("Some Message"), 就这样,谢谢阅读 。。。。。。。 。。。。。。。。。 。。。。。。。。。。。 。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。 没有什么比从直接“”…

web前端网页课程设计大作业 html+css+javascript天津旅游(11页) dw静态旅游网页设计实例 企业网站制作

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

草料二维码如何在多行业实现管理和自动化工作

二维码,在我们的日常生活中随处可见,不管是我们常用的微信支付,还是日常出入的场所码,已经渗透在我们生活的点点滴滴中。 如果我们自己也希望通过二维码,来传达文字、数据等信息,那么很多人都肯定给你推荐…