GO语言基础笔记(三):复合类型

        深入学习Go语言中的复合类型:数组、切片、映射(Map)和结构体。这些类型是构建复杂数据结构和实现复杂逻辑的基础。

目录

1. 数组(Array)

 遍历数组

多维数组

数组作为函数参数 

2. 切片(Slice)

切片的长度和容量

添加元素到切片

切片的切片操作

使用make创建切片 

多维切片 

遍历切片 

3. 映射(Map)

检索映射中的元素

删除映射中的元素

使用make创建映射

遍历映射

4. 结构体(Struct)

结构体作为函数参数

使用指针操作结构体

定义结构体的方法


1. 数组(Array)

  • 定义:数组是具有相同类型元素的固定长度序列。
  • 声明方式var arr [n]Type,其中n是数组的长度,Type是存储元素的类型。
  • 特点:长度固定,一旦声明,长度不能改变。
var arr [5]int
arr[0] = 1
fmt.Println(arr) // 输出:[1 0 0 0 0]

 遍历数组

    // 使用for循环遍历数组for i := 0; i < len(arr2); i++ {fmt.Printf("arr2[%d] = %d\n", i, arr2[i])}// 使用for range遍历数组for index, value := range arr2 {fmt.Printf("索引:%d, 值:%d\n", index, value)}

多维数组

    // 声明一个二维数组var matrix [2][3]intmatrix[0] = [3]int{1, 2, 3}matrix[1] = [3]int{4, 5, 6}fmt.Println("二维数组:", matrix)

数组作为函数参数 

    // 数组作为函数参数sum := sumArray(arr2)fmt.Println("数组和:", sum)
}// 函数接受一个整型数组作为参数
func sumArray(arr [5]int) int {sum := 0for _, value := range arr {sum += value}return sum
}

2. 切片(Slice)

  • 定义:切片是对数组的封装,提供更灵活、更强大的序列接口。
  • 声明方式var slice []Type,切片不需要指定长度。
  • 特点:长度可变,可以动态地增长或缩短。
slice := []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice) // 输出:[1 2 3 4]

切片的长度和容量

    // 使用len和cap函数fmt.Println("长度:", len(slice2), "容量:", cap(slice2))

添加元素到切片

    // 添加元素到切片slice2 = append(slice2, 6)fmt.Println("添加元素后的切片:", slice2)

切片的切片操作

    // 创建切片的切片subSlice := slice2[1:3]fmt.Println("切片的切片:", subSlice)

使用make创建切片 

    // 使用make创建切片slice3 := make([]int, 3) // 长度为3的切片fmt.Println("使用make创建的切片:", slice3)

多维切片 

    // 创建一个二维切片twoDSlice := make([][]int, 3)for i := 0; i < 3; i++ {innerLen := i + 1twoDSlice[i] = make([]int, innerLen)for j := 0; j < innerLen; j++ {twoDSlice[i][j] = i + j}}fmt.Println("二维切片:", twoDSlice)

遍历切片 

    // 使用for range遍历切片for index, value := range slice2 {fmt.Printf("索引:%d, 值:%d\n", index, value)}
}

3. 映射(Map)

  • 定义:映射是存储键值对的无序集合。
  • 声明方式var mapVar map[KeyType]ValueType
  • 特点:键唯一,通过键快速检索对应的值。
m := make(map[string]int)
m["key1"] = 7
m["key2"] = 13
fmt.Println(m) // 输出:map[key1:7 key2:13]

检索映射中的元素

    // 检索键值对age, ok := map2["Alice"]if ok {fmt.Println("Alice的年龄:", age)} else {fmt.Println("Alice不在映射中")}

删除映射中的元素

    // 删除键值对delete(map2, "Bob")fmt.Println("删除Bob后的映射:", map2)

使用make创建映射

    // 使用make创建映射map3 := make(map[string]int)map3["Dave"] = 28fmt.Println("使用make创建的映射:", map3)

遍历映射

    // 使用for range遍历映射for key, value := range map2 {fmt.Printf("键:%s, 值:%d\n", key, value)}
}

4. 结构体(Struct)

  • 定义:结构体是一种聚合数据类型,它将不同类型的数据聚合到一个复合类型中。
  • 声明方式type StructName struct { Field1 Type1; Field2 Type2; ... }
  • 特点:非常适合用来创建数据模型。
type Person struct {Name stringAge  int
}var p Person
p.Name = "Alice"
p.Age = 30
fmt.Println(p) // 输出:{Alice 30}

结构体作为函数参数

    // 调用函数,传递结构体作为参数printPerson(person1)printPerson(person2)
}// 函数接受一个Person类型的参数
func printPerson(p Person) {fmt.Printf("%s is %d years old.\n", p.Name, p.Age)
}

使用指针操作结构体

    // 使用指针修改结构体changeName(&person1, "Alice Cooper")fmt.Println("Updated Person 1:", person1)
}// 函数接受一个指向Person的指针,并修改其中的字段
func changeName(p *Person, newName string) {p.Name = newName
}

定义结构体的方法

// Person类型的方法
func (p Person) Greet() {fmt.Println("Hi, my name is", p.Name)
}func main() {person1 := Person{Name: "Alice", Age: 30}person1.Greet() // 调用Person的方法
}

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

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

相关文章

单片机的RTC获取网络时间

理解网络同步校准RTC的原理需要考虑NTP、SNTP、RTC这三个关键组件的作用和交互。下面详细解释这个过程&#xff1a; 1. NTP&#xff08;Network Time Protocol&#xff09;&#xff1a; 协议目的&#xff1a;NTP是用于同步计算机和设备时钟的协议。它通过在网络上与时间服务器通…

Java中Collections详解

Java中Collections详解 在Java中&#xff0c;java.util.Collections 是一个实用类&#xff0c;提供了各种静态方法&#xff0c;用于对集合进行操作和控制。这个类包含了许多有用的方法&#xff0c;用于对集合进行排序、查找、替换等操作。以下是一些 Collections 类中常用方法…

JUC AQS ReentrantLock源码分析

AQS java.util.concurrent.locks.AbstractQueuedSynchronizer AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及…

前端性能优化十八:减少浏览器的回流和重绘

1. css: ①. 避免过多样式嵌套:a. 尽量让浏览器一次性找到样式.②. 避免使用css表达式:a. 在每次css绘制的过程中都是会执行.③. 使用绝对定位可以让动画元素脱离文档流:a. 给动画元素做单独定位④. 避免使用table布局:a. 会引起浏览器多次重绘⑤. 尽量不适用float布局:a. 可以…

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节…

Golang make vs new

文章目录 1.简介2.区别3.new 可以初始化 slice&#xff0c;map 和 channel 吗&#xff1f;4.make 可以初始化其他类型吗&#xff1f;5.小结参考文献 1.简介 在 Go 语言中&#xff0c;make 和 new 是两个用于创建对象的内建函数&#xff0c;但它们有着不同的用途和适用范围。 …

DLLNotFoundException:xxx tolua... 错误打印

DLLNotFoundException:xxx tolua... 错误打印 一、DLLNotFoundException介绍二、Plugins文件夹文件目录结构如下&#xff1a; 三、Plugins中的Android文件夹四、Plugins中的IOS文件夹这里不说了没测试过不过原理应该也是选择对应的平台即可五、Plugins中的x86和X86_64文件夹 一…

浅学JWT跨域认证

Json Web令牌简称JWT JWT的使用 加入依赖 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.3.0</version> </dependency> 测试案例 Test //生成token void jwtdemo01(){Calendar in…

【机器学习】模式识别

1 概述 模式识别&#xff0c;简单来讲&#xff0c;就是分类问题。 模式识别应用&#xff1a;医学影像分析、人脸识别、车牌识别、遥感图像 2 模式分类器 分类器的分类&#xff1a;线性分类器、非线性分类器、最近邻分类器 2.1 分类器的训练&#xff08;学习&#xff09;过…

Featured Based知识蒸馏及代码(3): Focal and Global Knowledge (FGD)

文章目录 1. 摘要2. Focal and Global 蒸馏的原理2.1 常规的feature based蒸馏算法2.2 Focal Distillation2.3 Global Distillation2.4 total loss3. 实验完整代码论文: htt

C语言中关于指针的理解

#include <stdio.h> int main() {int a11;int *p&a; //因为a是整型的&#xff0c;所以我们定义指针p的时候要和a的类型一样char b;char *pa&b; //同理&#xff0c;b是字符型&#xff0c;所以这里的pa也要用字符型return 0; }因为*p指向的是地址&…

Pytorch项目,肺癌检测项目之四

# 安装图像处理 的两个包 simpleITK 和 ipyvolume # 安装缓存相关的两个包 diskcache 和 cassandra-driver import gzip from diskcache import FanoutCache, Disk from cassandra.cqltypes import BytesType from diskcache import FanoutCache,Disk,core from diskcache…

LabVIEW在横向辅助驾驶系统开发中的应用

LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展&#xff0c;越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统&#xff08;ADAS&#xff09;中的横向辅助驾驶进行深入研究。在这项研究中&#xff0c;LabVIEW作为一个强大的系…

刷题第五十一天 84. 柱状图中最大矩形

好难&#xff0c;看解析&#xff1a; # 双指针 class Solution:def largestRectangleArea(self, heights: List[int]) -> int:size len(heights)# 两个DP数列储存的均是下标indexmin_left_index [0] * sizemin_right_index [0] * sizeresult 0# 记录每个柱子的左侧第一…

【并发设计模式】聊聊两阶段终止模式如何优雅终止线程

在软件设计中&#xff0c;抽象出了23种设计模式&#xff0c;用以解决对象的创建、组合、使用三种场景。在并发编程中&#xff0c;针对线程的操作&#xff0c;也抽象出对应的并发设计模式。 两阶段终止模式- 优雅停止线程避免共享的设计模式- 只读、Copy-on-write、Thread-Spec…

ubuntu常用指令

Ubuntu是一个基于Linux的操作系统&#xff0c;它使用了大量的命令行指令。这些指令对于管理系统、处理文件、监控资源和执行各种任务都非常有用。以下是一些常用的Ubuntu命令&#xff1a; 系统管理 sudo&#xff1a;提供管理员权限执行命令&#xff08;例如 sudo apt update&a…

vmware安装中标麒麟高级服务器操作系统软件 V7.0操作系统

vmware安装中标麒麟高级服务器操作系统软件 V7.0操作系统 1、下载中标麒麟高级服务器操作系统软件 V7.0镜像2、安装中标麒麟高级服务器操作系统软件 V7.0操作系统 1、下载中标麒麟高级服务器操作系统软件 V7.0镜像 官方提供使用通道 访问官网 链接: https://www.kylinos.cn/ 下…

PHP之Trait理解, Trait介绍

一、来源 自 PHP 5.4.0 起&#xff0c;PHP 实现了一种代码复用的方法&#xff0c;称为 trait。 Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制&#xff0c;使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和…

C/C++图型化编程

一、创建图形化窗口&#xff1a; 1.包含头文件&#xff1a; graphics.h:包含已经被淘汰的函数easyx.h:只包含最新的函数 2.两个函数就可以创建窗口&#xff1a; 打开&#xff1a;initgraph(int x,int y,int style);关闭&#xff1a;closegraph(); 3.窗口坐标的设置&#…

2023年浙大城市学院新生程序设计竞赛(同步赛)G

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先想法非常单一&#xff0c;一定是去枚举操作点&#xff0c;然后看它染白和不染的价值差值 也就是说&#xff0c;把一个黑色结点染白之后&#xff0c;对哪些结点的价值会影响 不难想象其实就是操作结点的子树和该点连通的…