【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,一经查实,立即删除!

相关文章

spring02

bean中公共属性抽取出来&#xff0c;统一配置 <bean class"com.cj.Animal" id"animal"><property name"category" value"犬科"/></bean><bean class"com.cj.Dog" id"dog1" parent"anim…

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

这些年我喜欢跟垃圾撕破脸&#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;下面…

【SpringBoot文件压缩下载】文件夹压缩下载

1. Controller 使用hutool的ZipUtil根据文件夹路径打包成File对象然后调用自定义的FileResponseUtil进行单线程数据传输 import cn.hutool.core.date.DateUtil; import com.github.xiaoymin.knife4j.annotations.ApiSort; import im.gy.zfile.core.util.FileResponseUtil; im…

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

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

微信小程序封装请求API-promise格式

微信小程序原生的请求API就是wx.request wx.request({url: example.php, //仅为示例&#xff0c;并非真实的接口地址data: {x: ,y: },header: {content-type: application/json // 默认值},success (res) {console.log(res.data)} })有时候不能很好的适配我们的开发需求&#…

通过Nginx实战讲解HTTP的301和302状态码的区别

通过Nginx实战讲解HTTP的301和302状态码的区别 1. 简介2. 301永久重定向3. 302临时重定向1. 简介 HTTP状态码中,301和302都是网页重定向跳转。301重定向是一种永久重定向,而302跳转是暂时的跳转    ● 为什么需要重定向:    网站是会被大量用户收藏在自己的浏览器收藏夹…

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

在数字化营销的新时代&#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…

java —— 网络编程(UDP)

一、InetAddress 类 InetAddress address1InetAddress.getLocalHost(); 该命令用于获取本机主机信息&#xff0c;返回主机名与 IP 地址&#xff0c;不过如果本机有多个网卡的话&#xff0c;返回的 IP 地址并不一定是目前正在联网的那个。 InetAddress address2InetAddress.g…

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

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

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

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

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

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

详解HTTP:HTTP/1.1哪些可以优化

随着互联网的发展和应用的不断丰富&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;作为网络通信的核心协议&#xff0c;承载着越来越重的流量和复杂的交互任务。虽然HTTP/1.1已经在很长一段时间内支撑着互联网的繁荣&#xff0c;但它本身也存在一些性能上的瓶颈和不足…

python format变量里有大括号报错

aa"{\"0\":{\"name\":\"0\",\"all\":{}}}".format(aa)本来想给all赋值为aa 报错 >>> aa"{\"0\":{\"name\":\"0\",\"all\":{}}}".format(aa) Traceback (most …

k8s设置pod资源请求和限制

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