【golang学习之旅】复杂数据类型——指针 函数

系列文章

【golang学习之旅】使用VScode安装配置Go开发环境
【golang学习之旅】报错:a declared but not used
【golang学习之旅】Go 的基本数据类型
【golang学习之旅】深入理解字符串string数据类型
【golang学习之旅】go mod tidy
【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using unaddressable value
【golang学习之旅】记录一次 error case : full error output: cc1: error: unrecognized command line option
【golang学习之旅】Go程序快速开始 & Go程序开发的基本注意事项
【golang学习之旅】Go语言常用转义字符
【golang学习之旅】Go中的变量(1)
【golang学习之旅】Go中的变量——基本数据类型(1)
【golang学习之旅】Go中的变量——基本数据类型(2)


  • 系列文章
  • 指针
  • 函数
    • 基本语法
    • 函数注意事项和细节讨论
    • init()函数
    • 匿名函数
    • 闭包


指针

基本数据类型,变量存的就是值,所以也叫值类型。

指针类型,指针变量存的是一个地址,这个地址所指向的空间存的才是值

package mainimport "fmt"func main() {var a int = 10fmt.Println("a 的地址:", &a)// ptr是一个指针变量,它的类型是*int,它指向int类型的变量avar ptr *int = &afmt.Printf("ptr的值: %v, ptr 的地址: %v\n", ptr, &ptr)fmt.Println("ptr指向的值:", *ptr)// 修改ptr指向的值*ptr = 20fmt.Println("修改后a的值:", a)
}输出:
a 的地址: 0xc00000a0b8
ptr的值: 0xc00000a0b8, ptr 的地址: 0xc00005a028
ptr指向的值: 10
修改后a的值: 20
  • 获取变量的地址使用&符号

  • 获取指针类型所指向的值,使用*

  • 可以通过指针修改所指向变量的值

练习:

在这里插入图片描述

值类型有:基本数据类型(int系列,float系列,bool,string)、复杂数据类型中的复合数据类型(数组和结构体)

引用类型有:非值类型就是引用类型


函数

基本语法

func 函数名(形参列表) (返回值列表){执行语句...
}
  • 函数声明包含一个函数名参数列表返回值列表函数体。如果函数没有返回值,则返回列表可以省略
  • 函数可以没有参数或接受多个参数
  • 函数可以返回任意数量的返回值。有返回值的函数,必须有明确的终止语句,否则会引发编译错误

在这里插入图片描述

Go中的每一个文件都属于一个包,也就是说Go是以包的形式来管理文件和项目目录结构的。

包的作用

  • 区分相同名字的函数、变量等标识符。不同包的文件中允许重名的标识符
  • 当程序文件很多时,可以很好的管理项目。比如module包、dao包、service包等等
  • 控制函数、变量等访问范围

包的注意事项

  1. 文件的包名通常和文件所在的文件夹名一致,一般为小写字母。

    在这里插入图片描述

  2. 当一个文件要使用其他包的函数或变量时,需先引入对应的包

    • 引入方式1:import “包名/包路径”

    • 引入方式2:

      import ("包名""包名"
      )
      

      在这里插入图片描述

  3. package指令在文件第一行,然后是import指令。接下来才是变量、函数声明等等

  4. 在访问其他包函数、变量时,其语法是包名.函数名

    在这里插入图片描述

  5. 如果包名较长,Go支持给包取别名。取别名后,原来的包名就不能使用了

    在这里插入图片描述

  6. 在同一个包下,不能有相同的函数名,否则报重复定义

函数注意事项和细节讨论

  1. 函数的形参列表可以是多个,返回值也可以是多个

  2. 函数的命名遵循标识符命名规范,首字母不能是数字。首字母是大写则该函数可以被其他包访问到,如果是小写,只能被本包文件使用

  3. 基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改值不会影响原值

package mainimport ("fmt"
)func test(name string) {name = "test"fmt.Println("test() ", name)
}
func main() {name := "main"test(name)fmt.Println("main() ", name)
}输出:
test()  test
main()  main
  1. 如果希望函数内的变量能够修改函数外的变量(指的是以值传递的方式的基本数据类型),可以传入变量的地址,函数内以指针的方式操作变量(从效果上类似引用数据类型的使用)

    package mainimport ("fmt"
    )func test(name *string) {*name = "test"fmt.Println("test() ", *name)
    }
    func main() {name := "main"test(&name)fmt.Println("main() ", name)
    }输出:
    test()  test
    main()  test
    
  2. 在Go中,函数本身也是一种数据类型,可以赋值给一个变量,通过该变量可以实现对函数的调用

    package mainimport ("fmt"
    )func getSum(n1, n2 int) int {return n1 + n2
    }
    func main() {a := getSumfmt.Printf("a 的类型 %T\n", a)res := a(1, 2) // 等价于 res := getSum(1, 2)fmt.Printf("res 的值 %d\n", res)
    }输出:
    a 的类型 func(int, int) int
    res 的值 3
    
  3. 为了简化数据定义,Go支持自定义数据类型。相当于一个别名

    比如:type myInt int //这时myInt就等价于int来使用了

  4. Go函数支持对返回值命名

    在这里插入图片描述

  5. 使用 _ 标识符时表示忽略该值,可以用作占位符

  6. Go支持可变参数。这里的可变参数实际上是slice切片,通过 args[index]的方式来访问各个值

    package mainimport ("fmt"
    )func getSum(num ...int) int {sum := 0for i := 0; i < len(num); i++ {sum += num[i]}return sum
    }
    func main() {sum := getSum(1, 2, 3, 4)fmt.Println(sum)
    }输出:
    10
    

init()函数

每一个源文件都可以包含一个init()函数,该函数会在main函数执行前,被Go运行框架调用。

package mainimport ("fmt"
)func init() {fmt.Println("init()...")
}func main() {fmt.Println("main()...")
}输出:
init()...
main()...
  1. 如果一个文件同时包含全局变量定义、init函数和main函数,那么执行的顺序是 : 全局变量定义->init函数->main函数
  2. init()函数最主要的作用是完成一些初始化的工作

匿名函数

使用方式:

  1. 在定义匿名函数时就直接调用
  2. 将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
package mainimport ("fmt"
)func main() {// 求两数之和// 匿名函数方式1res1 := func(n1, n2 int) int {return n1 + n2}(10, 20)fmt.Println("匿名函数方式1...res1 = ", res1)// 匿名函数方式2func1 := func(n1, n2 int) int {return n1 + n2}res2 := func1(10, 20)fmt.Println("匿名函数方式2...res2 = ", res2)
}输出:
匿名函数方式1...res1 =  30
匿名函数方式2...res2 =  30

闭包

闭包就是第一个函数和与其相关的引用环境组合的一个整体(实体)。

现在开始通过例子来说明闭包:

func incr() func() int {var x intreturn func() int {x++return x}
}

调用这个函数会返回一个函数变量。

i := incr():通过把这个函数变量赋值给 ii 就成为了一个闭包

所以 i 保存着对 x 的引用,可以想象 i 中有着一个指针指向 xi 中有 x 的地址

由于 i 有着指向 x 的指针,所以可以修改 x,且保持着状态:

println(i()) // 1
println(i()) // 2
println(i()) // 3

也就是说,x 逃逸了,它的生命周期没有随着它的作用域结束而结束

但是这段代码却不会递增:

println(incr()()) // 1
println(incr()()) // 1
println(incr()()) // 1

这是因为这里调用了三次 incr(),返回了三个闭包,这三个闭包引用着三个不同的 x,它们的状态是各自独立的。

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

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

相关文章

这就是人性的丑恶,很残酷但很现实

这些年我喜欢跟垃圾撕破脸&#xff0c;包括垃圾亲戚&#xff0c;我是不会跟你讲什么感情的&#xff0c;该滚蛋就滚蛋。我最不喜欢听什么今日留一线&#xff0c;日后好相见。 之前我还不懂事的时候&#xff0c;就有那种亲戚叫我帮他介绍工作&#xff0c;我照做了。 结果&#xf…

Android 11 ,默认授予预置应用/APK 需要的权限,解决permission denied for window type 2003 问题。

写这篇文章的原因是解决了一个APP闪退的问题&#xff0c;闪退的原因是插拔U盘时&#xff0c;注册的广播接收者接收到广播需要弹出一个Dialog询问是否需要打开U盘&#xff0c;这个Dialog设置的是系统级别悬浮窗&#xff0c;没有这个权限&#xff0c;报错导致闪退&#xff0c;下面…

腰背肌筋膜炎的症状及治疗

腰背肌筋膜炎的症状 一、疼痛特点&#xff1a; 主要表现为腰背部弥漫性钝痛&#xff0c;尤以两侧腰肌及髂嵴上方更为明显。疼痛特点为晨起痛&#xff0c;日间轻&#xff0c;傍晚复重。长时间不活动或活动过度均可诱发疼痛&#xff0c;病程长&#xff0c;且因劳累及气候变化而发…

小红书营销:解锁企业增长新引擎,与小红书集成实现精准获客

在数字化营销的新时代&#xff0c;小红书以其独特的社区文化和精准的用户定位&#xff0c;成为了品牌和企业争相入驻的热门平台。今天将探讨如何通过小红书平台进行营销获客&#xff0c;并强调与企业集成的重要性&#xff0c;以实现更高效的品牌增长。 一、小红书营销的独特优…

基于 MHA 的 MySQL 高可用主从架构

Author&#xff1a;Arsen Date&#xff1a;2024/06/25 目录 一、前言1.1 概述1.2 组件1.3 流程 二、环境三、部署3.1 基本环境3.1.1 hosts 配置3.1.2 配置 SSH 免密访问 3.2 MySQL 主从3.2.1 基础环境配置3.2.2 启动 MySQL 实例3.2.3 配置 MySQL 主从3.2.4 MySQL 主从同步验证 …

Calibre - 合并电子书(EpubMerge)

这里使用 Calibre 软件和 EpubMerge 插件 EpubMerge github &#xff1a; https://github.com/JimmXinu/EpubMerge 1、安装 Merge 插件 安装后需要重启 calibre 2、查看设置 4 3、选中文件、开始合并 合并完成后&#xff0c;会弹窗窗口&#xff0c;来编辑 合辑的元信息 完成…

基于python的随机森林多分类模型

1.随机森林多分类模型 1.1 基本原理 随机森林&#xff08;Random Forest&#xff09;是一种基于决策树的集成学习方法&#xff0c;它通过将多个决策树进行组合&#xff0c;以投票或平均的方式得到最终的预测结果。在多分类问题中&#xff0c;随机森林通过构建多个决策树&#…

开发RpcProvider的网络服务

首先更改src的CMakeLists.txt的内容为&#xff1a; #当前目录的所有源文件放入SRC_LIST aux_source_directory(. SRC_LIST)#生成SHARED动态库 #add_library(mprpc SHARED ${SRC_LIST})#由于muduo是静态库&#xff0c;为了使用muduo&#xff0c;将mprpc也生成为静态库 add_libr…

A股周一走势历史罕见,你知道是为什么吗?

今天的A股&#xff0c;让人历史罕见&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天大盘低开低走&#xff0c;跌懵了&#xff0c;两市板块全部在等待翻红&#xff0c;这让人历史罕见。 2、盘面出现2个重要信号&#x…

【计算机毕业设计】167校园失物招领微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

办公人导航-上网导航,找网站,下软件,找资源!

办公人导航是一个专门为办公人员设计的实用导航网站&#xff0c;旨在帮助用户高效地找到各种优质的办公资源和工具。无论是需要查找办公软件、学习资源还是娱乐工具&#xff0c;在办公人导航上都能找到你需要的内容。 办公人导航-实用的办公生活导航网站&#xff01;https://ww…

PADS系列:如何导入元件库新建元件

对于普通的原理图&#xff0c;位置的摆放是比较随意的&#xff0c;并且也没有一些特殊的或者元件库里面没有的元件&#xff0c;相对来说绘制会比较简单。但是如果碰上复杂一点的电路&#xff0c;要绘制起来就会比较麻烦&#xff0c;需要一些新的PADS使用技巧&#xff0c;最基础…

k8s设置pod资源请求和限制

设置资源请求和限制 实验目标&#xff1a; 学习如何为 Pod 设置资源请求和限制&#xff0c;以优化集群资源分配。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 和内存的资源请求和限制。使用 kubectl describe 命令查看资源分配情况。观察资源限制对 P…

全球首个数字人开源了

DUIX&#xff08;Dialogue User Interface System&#xff09;是硅基智能打造的AI数字人智能交互平台。通过将数字人交互能力开源&#xff0c;开发者可自行接入多方大模型、语音识别&#xff08;ASR&#xff09;、语音合成&#xff08;TTS&#xff09;能力&#xff0c;实现数字…

Chrome Tracing flow event demo

Chrome Tracing flow event demo 1.效果2.解释3.代码 Chrome Tracing flow event demo 1.效果 2.解释 cpu_op 为host上的opkernel 为device上的kernel标记一条线 {"ph": "s", "id": 13, "pid": 1, "tid": 100, "ts&qu…

【Containerd】Containerd接入Harbor仓库

说明 在日常使用容器时&#xff0c;安全方便起见一般都会使用到私有仓库&#xff0c;一般都是采用 harbor 作为私有仓库&#xff0c;docker 对接 harbor 仓库非常简单&#xff0c;那么 containerd 如何对接 harbor 呢&#xff1f; 在内网使用 harbor 根据个人习惯&#xff0c…

eNSP中ACL访问控制表的配置和使用

一、拓扑图 1.新建拓扑图 2.PC端配置 PC1: PC2: PC3: 二、基本命令配置 1.S1配置 <Huawei>system-view [Huawei]sysname S1 [S1]vlan 10 [S1-vlan10]vlan 20 [S1-vlan20]vlan 30 [S1-vlan30]quit [S1]interface Vlanif 10 [S1-Vlanif10]ip address 192.168.10…

Gradle学习-2 Groovy

1、Groovy基础语法 1.1、基本数据类型 Groovy支持数据类型&#xff1a;byte, short, int, long, float, double, char &#xff08;1&#xff09;创建一个Android Studio项目 &#xff08;2&#xff09;在根目录新建一个 leon.gradle&#xff0c;输入以下内容 leon.gradle…

Ansible自动化运维,(1)模块

ansible是基于Python语言实现的&#xff0c;模块化&#xff1a;调用特定的模块完成特定的任务&#xff0c;支持自定义模块&#xff0c;可使用任何编程语言写模块(账号&#xff0c;软件等)。部署简单&#xff0c;基于python和SSH&#xff0c;相对安全&#xff0c;基于OpenSSH。 …

高考填报志愿,为何要优先考虑个人兴趣 ?

随着高考成绩纷纷出炉&#xff0c;考生又要面对人生另外一个重要的选择&#xff0c;那便是填报志愿&#xff0c;这关系到自己能否进入满意的学校和专业。如果考生对上述两个方面都不满意&#xff0c;那高考目的就没有达到。既然填报志愿如此重要&#xff0c;考生和家长在选择的…