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

news2024/10/7 18:30:31

系列文章

【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 main

import "fmt"

func main() {
	var a int = 10
	fmt.Println("a 的地址:", &a)
	// ptr是一个指针变量,它的类型是*int,它指向int类型的变量a
	var ptr *int = &a
	fmt.Printf("ptr的值: %v, ptr 的地址: %v\n", ptr, &ptr)
	fmt.Println("ptr指向的值:", *ptr)
	// 修改ptr指向的值
	*ptr = 20
	fmt.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 main

import (
	"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 main
    
    import (
    	"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 main
    
    import (
    	"fmt"
    )
    
    func getSum(n1, n2 int) int {
    	return n1 + n2
    }
    func main() {
    	a := getSum
    	fmt.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 main
    
    import (
    	"fmt"
    )
    
    func getSum(num ...int) int {
    	sum := 0
    	for 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 main

import (
	"fmt"
)

func init() {
	fmt.Println("init()...")
}

func main() {
	fmt.Println("main()...")
}

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

匿名函数

使用方式:

  1. 在定义匿名函数时就直接调用
  2. 将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
package main

import (
	"fmt"
)

func main() {
	// 求两数之和
	// 匿名函数方式1
	res1 := func(n1, n2 int) int {
		return n1 + n2
	}(10, 20)
	fmt.Println("匿名函数方式1...res1 = ", res1)
	// 匿名函数方式2
	func1 := 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 int
	return 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.coloradmin.cn/o/1862054.html

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

相关文章

【嵌入式Linux】<总览> 进程间通信(更新中)

文章目录 前言 一、管道 1. 概念 2. 匿名管道 3. 有名管道 二、内存映射区 1. 概念 2. mmap函数 3. 进程间通信&#xff08;有血缘关系&#xff09; 4. 进程间通信&#xff08;没有血缘关系&#xff09; 5. 拷贝文件 前言 在文章【嵌入式Linux】&#xff1c;总览&a…

RAID详解及配置实战

目录 一、RAID磁盘阵列及详解 1.1 了解RAID 1.1.1 简单理解 1.1.2 对比了解 1.2 RAID磁盘阵列介绍 1.3 RAID功能实现 1.4 RAID实现的方式 1.5 RAID级别详解 1.5.1 RAID -0 1.5.2 RAID -1 1.5.3 RAID -5 1.5.4 RAID -10&#xff08;RAID 10&#xff09; 1.6 阵列卡…

2024年最新通信安全员考试题库,随时在线刷题

46.劳动防护用品不同于一般的商品&#xff0c;直接涉及到劳动者的生命安全和身体健康&#xff0c;故生产经营单位为从业人员提供的劳动防护用品必须符合&#xff08; &#xff09;或行业标准。 A.地方标准 B.国家标准 C.消防标准 D.LA劳安认证 答案:B 47.矿山、金属冶炼、…

本地可以Run大模型吗?Llama3?安排!

➡️ 前言 本地可以跑大模型吗? ChatGPT发布之后&#xff0c;引起了AI领域剧烈震动&#xff0c;从2023年3月百度发布新一代大预言模型文心一言开始&#xff0c;大模型如雨后春笋般不断涌现&#xff0c;国内阿里巴巴的通义千问、华为的盘古大模型、科大讯飞的星火认知大模型、…

大学网页制作作品1

作品须知&#xff1a;1.该网页作品预计分为5个页面&#xff08;其中1个登录页面&#xff0c;1个首页主页面&#xff0c;3个分页面&#xff09;&#xff0c;如需要可自行删改增加页面。&#xff08;总共约800行html,1200行css,100行js&#xff09; 2.此网页源代码只用于学习和模…

面相对象程序设计

面相对象程序设计包含内容如下 局域网聊天程序设网页浏览器设计电子日历记事本的设计 以其中的一个的报告进行举例 1需求与总体设计 1 1.1需求分析 1 1.2总体设计方案 1 1.2&#xff0e;1系统功能分析以及功能表 1 1.3系统类图的关系以及表之间的联系 2 2详细设计 3 2.1 Manag…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

RS232自由转Profinet协议网关模块连接1200PLC与扫码枪通讯及手动清零案例

一、RS232和Profinet这两种通讯接口的特点和应用场景&#xff1a; RS232是一种串行通讯接口标准&#xff0c;常用于连接计算机和外部设备&#xff0c;传输速率较低但稳定可靠。Profinet则是一种工业以太网通讯协议&#xff0c;具有高速、实时性强的特点&#xff0c;适用于工业…

群智优化:探索BP神经网络的最优配置

群智优化&#xff1a;探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到&#xff0c;而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征&#xff1a; 鸢尾花数据集包含了150个样本&#…

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

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

适合实习生使用的工作笔记软件

作为一名初入职场的实习生&#xff0c;我每天都面临着海量的信息和工作任务。刚开始时&#xff0c;我常常手忙脚乱&#xff0c;生怕漏掉任何重要细节。对于实习生来说&#xff0c;好的工作笔记软件不仅能帮助我们系统地整理工作信息&#xff0c;还能提高工作效率&#xff0c;确…

数据结构---二叉树前中后序遍历

1. 某完全二叉树按层次输出&#xff08;同一层从左到右&#xff09;的序列为 ABCDEFGH 。该完全二叉树的前序序列为() A: ABDHECFG B: ABCDEFGH C: HDBEAFCG D: HDEBFGCA 2. 二叉树的先序遍历和中序遍历如下&#xff1a;先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则二叉…

最新AIGC系统源码-ChatGPT商业版系统源码,自定义ChatGPT指令Promp提示词,AI绘画系统,AI换脸、多模态识图理解文档分析

目录 一、前言 系统文档 二、系统演示 核心AI能力 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI模型提问 文档分析 ​识图理解能力 3.2 GPts应用 3.2.1 GPTs应用 3.2.2 GPTs工作台 3.2.3 自定义创建Promp指令预设应用 3.3 AI专业绘画 3.3.1 文…

Day60 代码随想录打卡|回溯算法篇---组合

题目&#xff08;leecode T77&#xff09;&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 方法&#xff1a;本题最直观的解法是使用暴力for循环遍历法&#xff0c;根据k的大小定for循环的嵌套次数&…

Java高级重点知识点-14-Set接口、HashSet底层原理讲解

文章目录 Set接口 (HashSet 、LinkedHashSet)HashSet底层原理(重点理解) Set接口 (HashSet 、LinkedHashSet) 无序不重复 HashSet集合 HashSet 是根据对象的哈希值来确定元素在集合中的存储位置&#xff0c;因此具有良好的存取和查找性能。 public class HashSetDemo {publ…

经典游戏案例:仿植物大战僵尸

学习目标&#xff1a;仿植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum…

数字图像分析(第一部分)

文章目录 第2章 图像数字化数字化采样与量化像素的邻域像素的距离图像采集网络**离散直线性**距离变换**第3章 图像变换可分离和正交图像变换2D DFT变换及其本质**哈达玛变换KL变换(PCA)第4章 形态学二值形态学膨胀和腐蚀开启和闭合击中-击不中变换二值形态学实用算法噪声滤除目…

DWC USB2.0协议学习1--产品概述

本章开始学习记录DWC_otg控制器&#xff08;新思USB2.0&#xff09;的特点、功能和应用。 新思USB 2.0 IP主要有两个文档需要参考&#xff1a; 《DesignWare Cores USB 2.0 Hi-Speed On-TheGo (OTG) Data book》 《DesignWare Cores USB 2.0 Hi-Speed On-TheGo (OTG) Progra…

数值分析笔记(三)函数逼近

最佳平方逼近 函数逼近是使用一种简单易算的函数来近似表示一个复杂函数。 该问题可转化为求解线性方程组 G n C F n ​ G_{n}CF_{n}​ Gn​CFn​​ 其中&#xff0c;系数 C ( c 0 , c 1 , ⋯ , c n ) T , F n ( ( f , φ 0 ) , ( f , φ 1 ) , ⋯ , ( f , φ n ) ) T C(c…

私域电商的新篇章:构建深度连接与高效生态

大家好&#xff0c;我是电商领域的探索者&#xff0c;今天我想和大家分享关于私域电商的一些心得与洞见。在这个数字化飞速发展的时代&#xff0c;如何构建与用户之间更为紧密、深入的连接&#xff0c;以及如何通过私域生态来挖掘用户的更大价值&#xff0c;成为了我们关注的焦…