当前位置: 首页 > article >正文

golang学习笔记16-数组

注:本人已有C,C++,Python基础,只写本人认为的重点。
C/C++和go最大的区别之一是前者数据类型写在变量名前,可读性强,后者却写在后面,可读性不太好,本人到现在还是不习惯。那么数组也是一样,除了数据类型位置不同,其他基本和C/C++一样,当然,有两个重要区别,一个是声明,一个是数组的数据类型。
1.声明:直接看代码

package main

import "fmt"

func main() {
	// 第一种:显式指定数组长度和元素
	// 这里我们创建一个长度为3的整数数组 arr1,并且在初始化时直接给出元素的值。
	// 注意,数组长度是固定的,因此 arr1 只能存储3个整数。
	var arr1 [3]int = [3]int{3, 6, 9}
	// 输出 arr1 的值
	fmt.Println(arr1)

	// 第二种:省略数组长度的声明
	// 在这种情况下,我们依然创建了一个长度为3的数组 arr2,但是没有明确写出数组长度。
	// Go 会根据初始化的元素数量自动推断出数组的长度。
	var arr2 = [3]int{1, 4, 7}
	// 输出 arr2 的值
	fmt.Println(arr2)

	// 第三种:使用省略号(...)自动推断长度
	// 这里使用省略号来声明数组,Go 会根据提供的元素数量自动确定数组长度。
	// 在这个例子中,arr3 的长度为4,因为我们提供了4个元素。
	var arr3 = [...]int{4, 5, 6, 7}
	// 输出 arr3 的值
	fmt.Println(arr3)

	// 第四种:使用索引初始化数组
	// 这里我们使用索引来初始化数组的特定元素。在这个例子中,我们定义了一个长度为4的数组 arr4。
	// 通过指定索引(例如 0, 1, 2, 3)来为每个元素赋值。
	// 这种方式可以在初始化时对数组的元素进行乱序赋值。
	var arr4 = [...]int{0: 33, 1: 99, 3: 88}
	// 输出 arr4 的值
	fmt.Println(arr4) //未初始化的地方默认为0,还记得吗?
}

二维数组也是差不多的,只不过方括号多了一个,花括号嵌套了,其余和C/C++一样。
2.数据类型:C/C++中,数组是引用类型,数组传入一个函数,在该函数中被更改,原数组也会改变,而go中的数组是值类型,只会传入副本,不会改变原值。解决方法很简单,用指针即可。示例如下:

package main

import "fmt"

// 函数接收数组的副本(值传递)
func modifyArray(arr [3]int) {
	arr[0] = 100 // 修改副本,不会影响原数组
	fmt.Println("Inside modifyArray (after modification):", arr)
}

// 函数接收数组的指针(引用传递)
func modifyArrayWithPointer(arr *[3]int) {
	arr[0] = 200 // 修改原数组,或者写成(*arr)[0]
	fmt.Println("Inside modifyArrayWithPointer (after modification):", *arr)
}

func main() {
	// 初始化数组
	originalArray := [3]int{1, 2, 3}

	// 通过值传递的方式
	fmt.Println("Before modifyArray:", originalArray)
	modifyArray(originalArray)                       // 传递的是副本
	fmt.Println("After modifyArray:", originalArray) // 原数组未改变

	// 通过指针传递的方式
	fmt.Println("\nBefore modifyArrayWithPointer:", originalArray)
	modifyArrayWithPointer(&originalArray)                      // 传递数组的指针
	fmt.Println("After modifyArrayWithPointer:", originalArray) // 原数组已改变
}


http://www.kler.cn/a/326151.html

相关文章:

  • PHP 表单 - 必需字段
  • STM32完全学习——使用标准库点亮LED
  • vs2022搭建opencv开发环境
  • Flutter网络通信-封装Dio
  • Spring Boot教程之Spring Boot简介
  • Py之pymupdf:基于langchain框架结合pymupdf库实现输出每个PDF页面的文本内容、元数据等
  • java 解析excel (本地资源)
  • Android常用C++特性之std::find_if
  • CF1619D.New Year‘s Problem
  • 解决 TypeError: Expected state_dict to be dict-like, , got <class ‘*‘>.
  • Acwing 最小生成树
  • 每日OJ题_牛客_NC40链表相加(二)_链表+高精度加法_C++_Java
  • 《黑神话:悟空》天命人速通法宝 | 北通鲲鹏20智控游戏手柄评测
  • linux打开桌面软件(wps)、获取已打开的文件名(wps)
  • Ini文件读写配置工具类 - C#小函数类推荐
  • 汽车免拆诊断案例 | 2016 款宾利GT车仪表盘上的多个故障灯点亮
  • 使用TensorFlow实现一个简单的神经网络:从入门到精通
  • 动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络
  • TiDB 性能测试的几个优化点
  • Leetcode热题100-438 找出字符串中所有字母异位数
  • R语言非参数回归预测摩托车事故、收入数据:局部回归、核回归、LOESS可视化...
  • 408算法题leetcode--第19天
  • java通过webhook给飞书发送群消息
  • PTA L1-080 乘法口诀数列
  • C语言线程编程深度解析
  • Elasticsearch UNASSIGNED 怎么修复