28-Golang中的数组

news2024/11/25 14:35:40

Golang中的数组

    • 数组介绍
    • 数组的定义和内存布局
      • 数组的定义
      • 数组的内存图
    • 数组 的使用
      • 访问数组元素
      • 案例
    • 四种初始化的方式
    • for-range结构遍历
      • 基本语法
      • 说明
      • 案例
    • 数组使用注意事项和细节
      • 数组应用案例
        • 1.创建一个byte类型的26个元素的数组,分别放置A-Z。使用for循环访问所有元素并打印出来
        • 2.请求出一个数组的最大值,并得到对应的下标
        • 3.请求出一个数组的和和平均值
        • 4.随机生成五个数,并将其反转打印

数组介绍

数组可以存放多个同一类型数据。数组也是一种数据类型,在Go中数组是值类型。

package main
import (
	"fmt"
	
)

func main() {
	//定义一个数组
	var hens [6]float64;
	//给数组的每个元素赋值,元素的每个下标是从0开始的
	hens[0] = 37.0
	hens[1] = 38.0
	hens[2] = 36.0
	hens[3] = 35.0
	hens[4] = 32.0
	hens[5] = 30.0
	//遍历数组求出总体重
	totalWeight := 0.0
	for i := 0 ; i < len(hens) ; i++ {
		totalWeight += hens[i]
	}
	//求出平均体重
	avgWeight := fmt.Sprintf("%.2f", totalWeight / float64(len(hens)))
	fmt.Printf("totalWeight=%v avgWeight=%v", totalWeight , avgWeight)
}

//totalWeight=208 avgWeight=34.67

总结:

  • 使用数组来解决问题,程序的可维护性增加
  • 而且代码更加清晰,容易扩展

数组的定义和内存布局

数组的定义

var 数组名 [数组大小] 数据类型

var a [5] int

赋初值 a[0] = 1 a[1] = 30 …

数组的内存图

在这里插入图片描述

package main
import (
	"fmt"
	
)

func main() {
	var intArr [3]int
	//当定义完数组后,其实数组的各个元素有默认值
	fmt.Println(intArr)

	fmt.Printf("intArr的地址=%p intArr[0]的地址是%p intArr[1]的地址是%p intArr[2]的地址是%p",
		&intArr ,&intArr[0] , &intArr[1], &intArr[2])
}

//intArr的地址=0xc000014180 intArr[0]的地址是0xc000014180 intArr[1]的地址是0xc000014188 intArr[2]的地址是0xc000014190

总结:

  • 1.数组的地址可以通过数组名来获取&intArr
  • 2.数组的第一个元素的地址,就是数组的首地址
  • 3.数组的各个元素的地址间隔是依据数组的类型决定的

数组 的使用

访问数组元素

数组名[下标] 比如:要是用a数组的第三个元素 a[2]

案例

从终端循环输入5个成绩,保存到float64数组,并输出

package main
import (
	"fmt"
	
)

func main() {
	var score [5]float64
	for i := 0 ; i < len(score); i++ {
		fmt.Println("请输入第%d个元素的值\n", i+1)
		fmt.Scanln(&score[i])
	}

	//变量数组打印
	for i := 0 ; i < len(score); i++ {
		fmt.Printf("score[%d]=%v\n", i , score[i])
	}
}
/*
请输入第1个元素的值
45
请输入第2个元素的值
78
请输入第3个元素的值
65
请输入第4个元素的值
23
请输入第5个元素的值
64
score[0]=45
score[1]=78
score[2]=65
score[3]=23
score[4]=64   
*/

四种初始化的方式

package main
import (
	"fmt"
	
)

func main() {
	var numArr01 [3]int = [3]int{1, 2, 3}
	fmt.Println("numArr01=", numArr01)

	var numArr02 = [3]int{1, 2, 3}
	fmt.Println("numArr02=", numArr02)

	//这里的[...]是规定的写法
	var numArr03 = [...]int{1, 2, 3}
	fmt.Println("numArr03=", numArr03)

	var numArr04 = [...]int{1 : 800, 0 : 900, 2:900}
	fmt.Println("numArr04=", numArr04)
}
/*
numArr01= [1 2 3]
numArr02= [1 2 3]
numArr03= [1 2 3]
numArr04= [900 800 900]
*/

for-range结构遍历

这是Go语言一种独有的结构,可以用来遍历访问数组的元素

基本语法

for index, value := range array01 {
...
}

说明

  • 1.第一个返回值index是数组的下标
  • 2.第二个value是该下标位置的值
  • 3.他们都是仅在for循环内部可见的局部变量
  • 4.遍历数组元素的时候,如果不想使用下标index,可以直接把下标index标为下划线
  • 5.index和value的名称不是固定的,即程序员可以自行指定,一般命名为index和value

案例

package main
import (
	"fmt"
	
)

func main() {
	//演示for-range遍历数组
	heroes := [...]string{"kunkun", "ikun", "heizi"}
	for i, v := range heroes {
		fmt.Printf("i=%v v=%v\n", i, v)
	}

	for _, v := range heroes {
		fmt.Printf("元素的值=%v\n", v)
	}
}
/*
i=0 v=kunkun
i=1 v=ikun
i=2 v=heizi
元素的值=kunkun
元素的值=ikun
元素的值=heizi
*/

数组使用注意事项和细节

  • 1.数组是多个相同类型数据的租户,一个数组一旦声明/定义了,其长度是固定的,不能动态变化
  • 2.var arr[] int 这是arr就是一个slice切片
  • 3.数组创建后,如果没有复制有默认值
    • 数值类型数组:默认值为0
    • 字符串数组:默认值为“ ”
    • bool数组:默认值为false
  • 5.使用数组的步骤1.声明数组并开辟空间内,2.给数组各个元素赋值(默认0值),3.使用数组
  • 6.数组的下标是从开始的
  • 7.数组下标必须在指定范围内使用,否则报panic:数组越界,比如:var arr[5]int 则有效下标为0-4
  • 8.Go的数组属值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响
  • 9.如果在其他函数中,去修改原来的数组,可以使用引用传递(指针方式)

在这里插入图片描述

  • 10.长度是数组类型的一部分,在传递参数时,需要考虑数组的长度
    在这里插入图片描述

数组应用案例

1.创建一个byte类型的26个元素的数组,分别放置A-Z。使用for循环访问所有元素并打印出来

package main
import (
	"fmt"
	
)

func main() {
	//声明一个数组 var myChars [26]byte
	//使用for循环,利用字符可以进行运算的特点来赋值
	//使用for循环打印即可

	var myChars [26]byte
	for i := 0 ; i < 26; i++ {
		myChars[i] = 'A' + byte(i) //注意需要将i转化为byte
	}

	for i := 0; i < 26; i++ {
		fmt.Printf("%c ", myChars[i])
	}
}

//A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

2.请求出一个数组的最大值,并得到对应的下标

package main
import (
	"fmt"
	
)

func main() {
	//声明一个数组 var intArr[5] = [...]int {1, -1, 9, 99, 11}
	//假定第一个元素就是最大值,下标就是0
	//然后从第二个元素开始循环比较,如果发现有更大的,则交换

	var intArr [5]int = [...]int {1, -1, 9, 99, 11}
	maxVal := intArr[0]
	maxValIndex := 0

	for i := 1; i < len(intArr); i++ {
		//然后从第二个元素开始循环比较,如果发现有更大的,则交换
		if maxVal < intArr[i] {
			maxVal = intArr[i]
			maxValIndex = i
		}
	}

	fmt.Printf("maxVal=%v maxValIndex=%v", maxVal, maxValIndex)
}

//maxVal=99 maxValIndex=3

3.请求出一个数组的和和平均值

package main
import (
	"fmt"
	
)

func main() {
	//声明一个数组 var intArr[5] = [...]int {1, -1, 9, 99, 11}
	//求出和sum
	//求出平均值
	var intArr2 [5]int = [...]int {1, -1, 9, 99, 11}
	sum := 0
	for _, val := range intArr2{
		//累积求和
		sum += val 
	}
    
    //如何让平均值保留到小数
    fmt.Printf("sum=%v 平均值=%v", sum, float64(sum) / float64(len(intArr2)))

}

//sum=119 平均值=23

4.随机生成五个数,并将其反转打印

package main
import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	//随机生成五个数,,rand.Intn()函数
	//当我们得到随机数后,就放到一个数组int数组中
	//反转打印

	var intArr [5]int
	//为了每次生成的随机数不一样,我们需要给一个seed值
	len := len(intArr)

	rand.Seed(time.Now().UnixNano())
	for i := 0; i < len; i++ {
		intArr[i] = rand.Intn(100) //0<=n<100
	}
	fmt.Println("交换前=", intArr)
	//反转打印,交换的次数是len/2
	//倒数第一个和第一个元素交换,倒数第二个和第二个交换
	temp := 0 //做一个临时变量
	for i := 0; i < len / 2; i++ {
		temp = intArr[len - 1 - i]
		intArr[len - 1 - i] = intArr[i]
		intArr[i] = temp
	}
	fmt.Println("交换后=", intArr)

}

//交换前= [41 20 28 53 9]
交换后= [9 53 28 20 41]

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

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

相关文章

分享SEO优化的8个技巧

什么是SEO? SEO是Search Engine Optimization的缩写&#xff0c;直译过来就是“搜索引擎优化”的意识。故名意思&#xff0c;SEO是一种优化&#xff08;提高&#xff09;网站在搜索引擎内的自然排名的行为的统称。 当里个当&#xff0c;当里个当&#xff0c;闲言碎语不要讲&a…

Web应用程序自动化测试工具Selenium的主要功能有哪些?

Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我们玩游戏用的按键精灵&#xff0c;可以按指定的命令自动操作&#xff0c;不同是Selenium可以直接运行在浏览器上&#xff0c;它支持…

VSCode最新版本下载安装详细教程(win10)

VSCode是Microsoft发布的一款运行于多个操作系统&#xff0c;针对于编写现代Web和云应用的跨平台的源代码编辑器&#xff0c; 可在桌面上运。它具有对JavaScript&#xff0c;TypeScript和Node.js的内置支持&#xff0c;并具有丰富的其他语言&#xff08;例如C&#xff0c;C&…

vue-echarts实现多功能图表

前言作为前端人员&#xff0c;日常图表、报表、地图的接触可谓相当频繁&#xff0c;今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用&#xff1b;作为“你值得拥有”专栏阶段性末篇&#xff0c;值得一看主要实现功能——中国地图——环形图——折…

Springboot扩展点之DisposableBean

前言DisposableBean&#xff0c;是在Spring容器关闭的时候预留的一个扩展点&#xff0c;从业务开发的角度来看&#xff0c;基本上是用不到的&#xff0c;但是Spring容器从启动到关闭&#xff0c;是Spring Bean生命周期里一个绕不开的节点&#xff0c;因此还是有必要学习一下&am…

Web3中文|关于以太坊“上海升级”,你需要知道哪些?

今年3月&#xff0c;以太坊将进行自2022年9月转向权益证明系统以来的首次大升级&#xff0c;即上海硬交叉。一旦以太坊完成“上海升级”&#xff0c;帮助运营网络的验证者将能够提取1600万枚被质押的以太币&#xff08;ETH&#xff09;。 除了重点落实以太坊改进建议——4895&…

吉林电视台启用乾元通多卡聚合系统广电视频传输解决方案

随着广播电视数字化、IP化、智能化的逐步深入&#xff0c;吉林电视台对技术改造、数字设备升级提出了更高要求&#xff0c;通过对系统性能、设计理念的综合评估&#xff0c;正式启用乾元通多卡聚合系统广电视频传输解决方案&#xff0c;将用于大型集会、大型演出、基层直播活动…

idea使用本地代码远程调试线上运行代码---linux环境

场景&#xff1a; 之前介绍过windows环境上&#xff0c;用idea进行远程调试那么在linux环境下实战一下 环境&#xff1a; linux 测试应用&#xff1a;使用docker部署的platform-multiappcenter-base-app-1.0.0-SNAPSHOT.jar 应用 测试应用端口&#xff1a;19001 测试工具&…

工欲善其事,必先利其器,分享5款Windows效率软件

工欲善其事&#xff0c;必先利其器。作为全球最多人使用的桌面操作系统&#xff0c;Windows 的使用效率与我们的工作学习息息相关。今天&#xff0c;小编就为大家整理了5款提高效率的利器&#xff0c;让你的 Windows 更具生产力。 1.桌面自定义——Rainmeter Rainmeter是一款…

快速部署私有云笔记,免费享受多端同步

一、老Q笔记之一路坎坷 市面上的笔记软件非常多&#xff0c;有些是本地编辑功能特别强大但是不支持云同步&#xff0c;有些是支持上云但是编辑功能不够完善。选择一款合适的云笔记软件&#xff0c;无疑能让我们工、学习的时候更加顺心、顺手。 这么多年来老Q使用过很多云笔记…

亚马逊云科技与CIT强强联手,因企制宜加速数字化进程

数字经济时代&#xff0c;数据逐渐成为企业重要的生产要素&#xff0c;并成为驱动生产力增长的助力。但数据的快速增长&#xff0c;也给企业带来了诸多挑战&#xff0c;如&#xff1a;企业将彻底改变内外部流程、数据量超越了传统数据库的管理能力等。 作为亚马逊云科技全球咨…

10、创建和管理表

文章目录1 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构4 修改表4.1 追加一个列4.2 修改一个列4.3 重命名一个…

yolov5使用

参考网址&#xff1a;https://zhuanlan.zhihu.com/p/501798155 源码下载及使用 release下载source及pt文件&#xff08;yolov5s.pt&#xff09; https://github.com/ultralytics/yolov5/tags https://github.com/ultralytics/yolov5/releases/tag/v5.0 安装yolov5训练所需的第…

433MHz无线通信--模块RXB90

1、接收模块RXB90简介 两个数据输出是联通的。 2、自定义一个编码解码规则 组数据为“0x88 0x03 0xBD 0xB6”。 3、发射模块 如何使用示波器得到捕捉一个周期的图像&#xff1f; 通过date引脚连接示波器CH1&#xff0c;以及示波器探针的接地端接芯片的GND&#xff0c;分…

初识C语言——函数

目录 一、库函数 二、自定义函数 三、函数的参数 四 、函数的调用 1 、传值调用 2 、传址调用 五、函数的嵌套调用和链式访问 六、函数的声明和定义 1 函数声明&#xff1a; 2 函数定义&#xff1a; 七、函数的递归与迭代 八、总结 一、库函数 库函数查询网站&#xff…

浅谈智慧城市管廊综合管理平台的建设

摘 要&#xff1a;随着智慧城市的发展&#xff0c;地下综合管廊的建设不断增多&#xff0c;建成后的管廊需要有科学合理的综合管理平台对其进行智能化管理。本文介绍了地下综合管廊的建设内容&#xff0c;从管廊智能化管理角度出发&#xff0c;在运用GIS、可视化、传感器、物联…

多线程服务器

设计一个客户端从服务器端获取时间的程序&#xff1a; 服务器端使用多线程的方式&#xff0c;当有客户端请求到达时&#xff0c;服务器将启动一个新线程为它返回当前的时间&#xff0c;服务完后线程自动销毁&#xff0c;服务器端会显示连接的次数。 客户端比较简单&#xff0c;…

MySQL安装手册

文章目录一、系统环境二、检查是否已安装三、安装步骤1、yum安装1.1、更新yum1.2、使用wget下载mysql yum源&#xff1a;1.3、添加 mysql yum 源:1.4、安装 yum 工具 yum-utils :1.5、查看可用的 mysql :1.6、查看所有的 mysql 版本1.7、使用指定版本MySQL1.8、查看当前启用的M…

Netty源码解读-server端(一)

一、回顾NIO中的server 下面是我在学习nio时&#xff0c;写的selctor版本的服务端&#xff0c;具体代码如下&#xff1a; public static void nioSelectorServer() throws Exception{//1。创建SelectorSelector selector Selector.open();ServerSocketChannel ssc ServerSo…

c++ bind 函数讲解

1.bind 函数的使用详解 可以将bind函数看作一个通用的函数适配器&#xff0c;它接受一个可调用对象&#xff0c;生成一个新的可调用对象来“适应”原对象的参数列表。 调用bind的一般形式&#xff1a;auto newCallable bind(callable,arg_list); 其中&#xff0c;newCallab…