【GO语言卵细胞级别教程】-08.美轮美奂的数组(含原码教程)
本文将介绍Go语言中的数组,并探讨其美轮美奂的特性。我们将详细讨论数组的定义、初始化、访问以及遍历等操作。此外,我们还将提供一个原码教程,帮助读者更好地理解和应用数组。通过本文的阅读,读者将对Go语言的数组有一个全面的了解,为开发高效的程序打下坚实的基础。
【GO语言卵细胞级别教程】-08.美轮美奂的数组
目录
🥰微信公众号:【给点知识】分享小知识,快速成长,欢迎关注呀!(底部点击二维码)
🥰本项目演示代码仓库:https://gitee.com/gdzsfun/csdn-study-go 演示项目仓库
🥰本项目创建方式:【GO语言卵细胞级别教程】05.项目创建和函数讲解
🥰学习宗旨:活到老,学到老。
😍写作宗旨:致力于改变现有文章难读难懂问题。
今日分享诗句
1.简介
Go语言(也称为Golang)是一种由Google开发的静态类型、编译型语言。Go中的数组是一种固定长度、相同类型元素的数据结构。以下是关于Go数组的一些重要信息:
2.数组初始化
- var 声明
// var声明变量
var score1 [5]int
for i:=0; i < len(scores); i++ {
scores[i] = rand.Intn(100)
fmt.Println(scores[i])
}
- 自动判断类型
// 不指定默认值
score2 := [1]int{}
- 指定默认值
// 指定默认值1:声明变量的时候加上初始值
var array[5]int = [5]int{1,2,3,4,5}
// 指定默认值2:指定默认值
score3 := [2]int(12, 23)
- 自动计算长度
var arr1 = [...]{1,2 3}
- 根据下标进行赋值
// 給下标为2的赋值66,会自动取最大的值当作数组长度。
fmt.Println("------给下标自动赋值------")
var indexArray1 = [...]int{2:66, 0:88, 6:99}
fmt.Println(indexArray1)
也可以结合普通赋值,进行赋值.注意普通数组放置的位置,一定要是其他根据下标不能冲突
如果var indexArray1 = […]int{19,2:66, 0:88, 6:99} 19放在了第一个 但是0:88已经有值了,所以这个时候就会冲突了
fmt.Println("------给下标自动赋值------")
var indexArray1 = [...]int{ 2:66,19, 0:88, 6:99}
fmt.Println(indexArray1)
3.数组内存知识
-
数组的内存地址是连续的
-
数组的声明的时候需要指定长度,这个长度在整个生命周期中是不可变的,因为申请的空间是固定的
-
数组变量存的是地址数组首个元素的地址
注意:fmt.Println()这个打印方法打印出数组的值[1 2 3] 类似这种,如果想查看地址的话可以使用fmt.Printf(“%p”, &scores3)或者使用自带的函数 println(&scores3)
scores3 := [2] int8 {12, 99}
fmt.Println(scores3)
println("println打印scores3地址:", &scores3)
fmt.Println("fmt.Println打印scores3地址:", &scores3)
fmt.Printf("arr的首个元素地址: %p\n", &scores3[0])
fmt.Printf("arr的第二个元素地址: %p\n", &scores3[1])
fmt.Printf("arr的地址: %p\n", &scores3)
-------------
[12 99]
println打印scores3地址: 0xc00000a194
fmt.Println打印scores3地址: &[12 99]
// 这里使用的是int8所以与下个地址之间间隔1个字节
arr的首个元素地址: 0xc00000a194
arr的首个元素地址: 0xc00000a195
arr的地址: 0xc00000a194
4.数组的遍历
- 使用下标遍历
for i:=0; i>=len(arr1);i++{
fmt.Println(arr1[1])
}
- 使用方法range 遍历
sum := 0
for index, value := range arr1 {
fmt.Println(index, value)
sum += value
}
5.数组的注意事项
- 数组类型:[x]int其中 数组的长度也是一部分。所以数组的类型是[6]int而不是int 或者[]int 而是包含长的的
var indexArray1 = [...]int{ 2:66,19, 0:88, 6:99}
fmt.Println(indexArray1)
fmt.Printf("%T", indexArray1)
// 输出结果
[88 0 66 19 0 0 99]
[7]int
- Python中数组是引用类型,什么意思呢
引用类型意味着当你将一个列表赋值给另一个变量时,实际上是将指向列表的引用复制给了新的变量,而不是创建一个新的列表副本。这意味着两个变量将引用同一个列表对象,对其中一个变量所做的修改也会影响到另一个变量。
PS D:\07.go\02.gostudy> python
Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:25:05) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1, 2, 3]
>>> b = a # 将a的引用赋值给b
>>> b.append(4)
>>> print(a) # 输出: [1, 2, 3, 4]
[1, 2, 3, 4]
而GO语言中的数组是数值类型,当赋值给另一个数组的时候,会把值复制一份,所有当其中一个修改的时候,并不会同时改变,这个时候两个互不相干,互不影响,如下测试两个数组,myarr1和myarr2
fmt.Println("------数组是数值类型------")
var myarr1 [3]int = [3]int{2, 3, 1}
var myarr2 [3]int
myarr2 = myarr1
fmt.Println(myarr1, myarr2)
myarr1[1] = 12
fmt.Println(myarr1, myarr2)
// 输出结果
------数组是数值类型------
[2 3 1] [2 3 1]
[2 12 1] [2 3 1]
如果想修改数组的话,可以使用数值指针
var myarr3 *[3]int
myarr3 = &myarr1
myarr3[0] = 100
fmt.Println(myarr1)
// 打印结果
[100 12 1]
6.二维数组
6.1数组初始化
- 初始化指定值 [2][3]int = [2][3]int{{1,2,3}}
- 初始化不指定值 var myarry5 [3][5]int
- 初始化使用三个点 […][2]int{{},{1,2}} 只能第一个使用三个点,不能后一个使用
- 初始化不使用var myarry7 := [3][3]int{}
// 二维数组
fmt.Println("------二维数组------")
// 初始化
var myarry4 [2][3]int = [2][3]int{{1,2,3}}
var myarry5 [3][5]int
fmt.Println(myarry5)
fmt.Println(myarry4)
myarry6 := [...][2]int{{},{1,2}}
fmt.Println(myarry6)
myarry7 := [3][3]int{}
fmt.Println(myarry7)
//输出结果
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
[[1 2 3] [0 0 0]]
[[0 0] [1 2]]
[[0 0 0] [0 0 0] [0 0 0]]
6.2数组遍历
- 方式1:for循环两次遍历,使用下标
- 方式2:使用range遍历
// 二维数组
fmt.Println("------二维数组------")
var myarry4 [2][3]int = [2][3]int{{1,2,3}}
var myarry5 [3][5]int
fmt.Println(myarry5)
fmt.Println(myarry4)
// 数组的遍历
// 遍历方式1
for i:=0; i<len(myarry4); i++{
for k:=0; k<len(myarry4[i]);k++{
fmt.Printf("arr[%v][%v]=%v ", i, k, myarry4[i][k])
}
println()
}
println()
// 遍历方式2使用range
for i1, arr4:=range myarry4{
for i2, value := range arr4{
fmt.Printf("arr[%v][%v]=%v ", i1, i2, value)
}
println()
}
//输出结果
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
[[1 2 3] [0 0 0]]
arr[0][0]=1 arr[0][1]=2 arr[0][2]=3
arr[1][0]=0 arr[1][1]=0 arr[1][2]=0
arr[0][0]=1 arr[0][1]=2 arr[0][2]=3
arr[1][0]=0 arr[1][1]=0 arr[1][2]=0
7.总结代码
package mystudy
// 数组
import "fmt"
import "math/rand"
func PrintlnQP(arr []int){
// 这里传递的是切片类型
for i, v := range arr{
fmt.Println(i, v)
}
}
func PrintlnArray(arr [2]int){
// 这里传递的是切片类型
for i, v := range arr{
fmt.Println(i, v)
}
}
func DemoArray(){
// 定义一个数组 变量名 := [个数] 类型
var scores [5]int
for i:=0; i < len(scores); i++ {
scores[i] = rand.Intn(100)
fmt.Println(scores[i])
}
// var countArray [5]int = [5]int{1, 2,3,4,5}
var countArray = [5]int{1, 2,3,4}
for i:=0; i < len(countArray); i++{
fmt.Println(countArray[i])
}
sum := 0
for index, value := range scores {
fmt.Println(index, value)
sum += value
}
fmt.Println("班级总成绩:", sum, "班级平均分:", float32(sum) / float32(len(scores)))
// 定义数组方式2 score := [个数]int{}
scores2 := [1]int{}
fmt.Println(scores2[0])
// 定义数组的时候提供默认值
scores3 := [2] int8 {12, 99}
fmt.Println(scores3)
println("println打印scores3地址:", &scores3)
fmt.Println("fmt.Println打印scores3地址:", &scores3)
fmt.Printf("arr的首个元素地址: %p\n", &scores3[0])
fmt.Printf("arr的第二个元素地址: %p\n", &scores3[1])
fmt.Printf("arr的地址: %p\n", &scores3)
// 用户输入分数
fmt.Println("---学生成绩管理系统---")
scores6 := [6] int {}
for i, _:= range scores6{
fmt.Print("输入学生", i+1, "的分数:")
fmt.Scanln(&scores6[i])
}
for i, value := range scores6{
fmt.Println("第", i+1 , "个学生的成绩", value)
}
fmt.Println("打印长度")
fmt.Println(len("小名111aaa"))
}
练习题
1.数组字符串拼接成字符串
- 拼接字符串:将给定的字符串数组,拼接成一个字符串
知识点:
1,for循环遍历切片
2,"+"可以拼接字符串
package main
import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串一维数组
* @return string字符串
*/
func join( s []string ) string {
// write code here
result := ""
for i:=0; i<len(s); i++{
result += s[i]
}
fmt.Println(result)
return result
}
2.统计字符串的字符个数
- 给定一个字符串,统计其中的字符个数(一个中文算一个)。
知识点:
1,汉字是采用unicode编码,占三个字节
2,字符传转化为rune数组
2,rune是int32的别名(-231~231-1),对比byte(-128~127),可表示的字符更多
3,len()可以求出rune数组的长度
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
func count( s string ) int {
// write code here
r:=[]rune(s)
count := 0
for i:=0; i<len(r); i++{
count +=1
}
return count
}
3.回文数字判断
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
知识点:
整型转化为字符串
字符串的遍历
package main
import "fmt"
import "strconv"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param x int整型
* @return bool布尔型
*/
func isPalindrome( x int ) bool {
// write code here
fmt.Println("------")
str := strconv.Itoa(x)
for i := 0; i < len(str)/2; i++{
if str[len(str)-i-1] != str[i]{
return false
}
}
return true
}
4.学生分数管理系统
手动输入6个学生的成绩,然后打印出来
fmt.Println("---学生成绩管理系统---")
scores6 := [6] int {}
for i, _:= range scores6{
fmt.Print("输入学生", i+1, "的分数:")
fmt.Scanln(&scores6[i])
}
for i, value := range scores6{
fmt.Println("第", i+1 , "个学生的成绩", value)
}
fmt.Println("打印长度")
fmt.Println(len("小名111aaa"))
fmt.Println("------给下标自动赋值------")
更多推荐
所有评论(0)