Go基础 数组 切片 Map

news/2024/7/8 6:51:05

数组

数组介绍

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

案例

package main

import "fmt"

func main() {
	// 计算 6个人 平均体重 以及体重总和
	var person [6]float64
	person[0] = 98
	person[1] = 90
	person[2] = 91
	person[3] = 3
	person[4] = 4
	person[5] = 96
	// 计算平均体重
	sum := 0.0
	for i := range person {
		sum += person[i]
	}
	sprintf := fmt.Sprintf("%.2f", sum/float64(len(person)))
	fmt.Printf("avg=%v", sprintf)
}

数组的使用

访问数组元素

数组名【下标】比如 你要使用a 数组的第三个的第三个元素 a[2]

入门案例

package main

import "fmt"

func main() {
	//终端循环输入 5个成绩 保存到 float 64 数组
	var scorearr [5]float64
	for i := 0; i < len(scorearr); i++ {
		fmt.Printf("请输入第%d个学生成绩", i+1)
		fmt.Scanln(&scorearr[i])

	}
	for i := 0; i < len(scorearr); i++ {
		fmt.Print(scorearr[i])
	}
}

初始化数组的方式

package main

func main() {
	// 数组初始化的方式
	var numArr01 [3]int = [3]int{1, 2, 3}
	println(numArr01)

	var numArr02 = [3]int{1, 6, 3}
	println(numArr02)

	var numArr03 = [...]int{1, 6, 3}
	println(numArr03)

	var numArr04 = [...]int{1: 800, 0: 99, 2: 44}
	println(numArr04)
}

遍历数组的方式

package main

import "fmt"

func main() {
	// 数组初始化的方式
	names := [...]string{"娇娇", "Amy", "小张"}
	// for range 遍历
	for i, name := range names {
		// 第一个返回值 index 是数组的下标
		// 第二个 value 是在 该下标位置的值
		// 他们都是在 for 内部的局部变量
		// 遍历数组元素的时候 不想要 index 可以用下划线代替
		fmt.Printf("i=%v  name=%v \n", i, name)
	}

}

数组使用的时候注意细节

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

切片

切片的基本介绍

1)切片的英文是slice
2)切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的l机制。
3)切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样。
4)切片的长度是可以变化的,因此切片是一个可以动态变化数组。
5)切片定义的基本语法:
var变量名[类型
比如: var a [] int

package main

import "fmt"

func main() {
	// 切片的基本使用
	var intArr [5]int = [...]int{1, 2, 4, 5, 6}
	// 声明、定义 一个切片
	//intArr[1:3] 表示的是 引用数组intArr
	// 引用 数组的起始下标为1 最后的下标为 3 (不包括3)
	slice := intArr[1:3]
	fmt.Println(slice)
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

}

切片的三种方式

方式一

定义一个切片,然后让切片去引用一个已经创建好的数据

package main

import "fmt"

func main() {
	// 切片的基本使用
	var intArr [5]int = [...]int{1, 2, 4, 5, 6}
	// 声明、定义 一个切片
	//intArr[1:3] 表示的是 引用数组intArr
	// 引用 数组的起始下标为1 最后的下标为 3 (不包括3)
	slice := intArr[1:3]
	fmt.Println(slice)
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

}

方式二

通过make 来创建切片

package main

import "fmt"

func main() {
	// 切片的基本使用
	//var intArr [5]int = [...]int{1, 2, 4, 5, 6}
	// 声明、定义 一个切片 参数说明: type:就是数据类型len:大小cap :指定切片容量,
	ints := make([]int, 3, 9)
	ints[0] = 80
	ints[1] = 80
	ints[2] = 80
	fmt.Println(ints)
}

方式三

定义一个切片直接就指定具体数据使用原理类似于make的方式

package main

func main() {
	var slice []int = []int{1, 3, 5}
	println(slice)
}

切片注意事项和细节说明

切片初始化时var slice = arr[startlndex:endIndex]
说明:从arr数组下标为startlndex,取到下标为endIndex的元素(不含arr[endIndex])。
切片初始化时,仍然不能越界。范围在[O-len(arr)]之间,但是可以动态增长
.1) var slice = arr[0:end]可以简写var slice = arr[:end]
2) var slice = arr[start:lep(arr)]可以简写: var slice = arr[start:]
3) var slice = arr[O:len(arr)]可以简写: var slice = arr[:]
cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。
切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用
切片可以继续切片

Map

map的声明
基本语法
var map变量名map[keytype]valuetypekey可以是什么类型
golang中的map,的 key可以是很多种类型,比如 bool,数字,string,指针,channel ,还可以是只包含前面几个类型的接口,结构体,数组
通常为int .string
注意: slice,map还有function不可以,因为这几个没法用==来判断

package main

import "fmt"

func main() {
	// 方式一 声明一个map
	var mapdemo map[int]string
	mapdemo = make(map[int]string, 10)
	mapdemo[1] = "娇娇"
	mapdemo[2] = "小张"
	fmt.Println(mapdemo)
	// 方式二
	m := make(map[int]string)
	m[1] = "娇娇"
	m[2] = "小张"
	// 方式三
	m1 := map[int]string{
		1: "ee",
		2: "ee",
	}
	fmt.Println(m1)
}


案例

用map 存放学生学号姓名和年龄

package main

import "fmt"

func main() {
	m := make(map[int]map[string]int)
	m[1] = map[string]int{
		"娇娇":   18,
		"amy":  18,
		"kiko": 18,
	}
	for i, m2 := range m {
		fmt.Printf("学生的学号为:%v \n ", i)
		for s, i2 := range m2 {
			fmt.Printf("学生的姓名为:%v \n ", s)
			fmt.Printf("学生的年龄为:%v \n ", i2)
		}

	}
}

map的切片

基本介绍

切片的数据类型如果是map,则我们称为slice of map,map切片,这样使用则map个数就可以动态变化了。

// 要求:使用一个map来记录monster的信息name和 age,也就是说一个monster对应一个map.并且妖怪的个数可以动态的增加=>map切片
func Monster() []map[string]string {
	// 创建一个 空的map
	m := make([]map[string]string, 2)
	m[0] = make(map[string]string)
	m[0]["name"] = "悟空"
	m[0]["age"] = "19"

	m[1] = make(map[string]string)
	m[1]["name"] = "悟空1"
	m[1]["age"] = "191"
	// 此时想童泰添加 必须append

	m2 := make(map[string]string)
	m2["name"] = "dddd"
	m2["age"] = "22"

	m = append(m, m2)

	return m
}

	
func main() {
	monster := Monster()
	for _, m := range monster {
		fmt.Println(m)

	}
	}

http://lihuaxi.xjx100.cn/news/76852.html

相关文章

MPLS 配置LDP本地会话实验 详解

MPLS 配置LDP本地会话 组网需求 在如图1所示&#xff0c;LSRA、LSRC为IP/MPLS骨干网的PE设备。LSRA和LSRC上需要部署MPLS L2VPN或L3VPN业务来实现VPN站点的互联&#xff0c;因此LSR间需要配置本地LDP会话来建立LDP LSP&#xff0c;实现承载VPN业务。 图1 配置LDP本地会话组网…

C/C++函数传参详解

问题引出 在编码过程中&#xff0c;新手经常会遇到的一个问题是&#xff0c;我明明在函数中交换了数据&#xff0c;为什么函数外面显示的不对&#xff0c;最常见的例子就是swap()函数。先看两个代码&#xff1a; 代码一&#xff1a; #include <stdio.h> void swap(int…

Jenkins+git+maven持续集成持续部署java项目(CI/CD)

文章目录一. jenkins的作用二.安装三.maven安装四.git安装五. jenkins官方中文文档六. 集成七.配置自动化发布测试八.端口冲突解决九.构建触发器十.邮件通知一. jenkins的作用 二.安装 官网下载地址: https://www.jenkins.io/download/ 本人采用下载war,上传服务器直接运行方式…

Node.js——初识Node.js

系列文章目录 文章目录系列文章目录一、什么是 Node.js二、下载和安装 Node.js1、普通方式2、使用 nvm 安装三、Node.js 和 JavaScript 的区别1、ECMScript2、JavaScript3、node.js四、commonjs1、什么是 commonjs2、安装 lodash五、debugger六、server 开发和前端开发的区别一…

一个nginx部署多个应用及nginx总结

一、背景知识 1、Nginx是什么&#xff1f; &&#xff1a;Web服务器&#xff0c;静态文件保存、响应http请求。 同时可以提供代理、负载均衡的功能。 2、为什么使用&#xff1f; &&#xff1a;主要是轻量级和高性能&#xff0c;在一般行业不明显&#xff0c;但在互联…

使用docker快速搭建运维神器-spug

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 什么是spug&#xff1f; 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理…

C++泛型编程:可变参数模板

最近在看有关智能指针源码的时候make_unique,make_shared(用来创建管理一个新对象)模板都是这么定义的 template<typename T, typename... Ts> std::unique_ptr<T> make_unique(Ts&&... params) {return std::unique_ptr<T>(new T(std::forward<…

(附源码)计算机毕业设计ssm黑河市劳务人员管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…