Go語言學習之數(shù)組的用法詳解
引言
數(shù)組是相同數(shù)據(jù)類型的一組數(shù)據(jù)的集合,數(shù)組一旦定義長度不能修改,數(shù)組可以通過下標(或者叫索引)來訪問元素。
相對于去聲明 number0, number1, ..., number99 的變量,使用數(shù)組形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于擴展。
數(shù)組元素可以通過索引(位置)來讀?。ɑ蛘咝薷模?,索引從0 開始,第一個元素索引為 0,第二個索引為1,以此類推。

一、數(shù)組的定義
1. 語法
var variable_name [SIZE] variable_type
variable_name:數(shù)組的名稱
SIZE:數(shù)組長度,必須是常量
variable_type:數(shù)組保存元素的類型
2. 示例
package main
import "fmt"
func main() {
var a [3]int //定義一個int類型的數(shù)組a,長度是3
var b [2]string //定義一個字符串類型的數(shù)組b,長度是2
fmt.Printf("a: %T\n", a) //使用%T來輸出類型
fmt.Printf("b: %T\n", b)
fmt.Printf("a: %v\n", a)
fmt.Printf("b: %v\n", b)
}
//輸出結果如下,可以看到?jīng)]初始化的值,int是0,而字符串則是空的字符串
a: [3]int
b: [2]string
a: [0 0 0]
b: [ ]從上面運行的結果中可以看出來,數(shù)組和長度和元素類型共同組成了數(shù)組的類型
二、數(shù)組的初始化
初始化,就是給數(shù)組的元素賦值,沒有初始化的數(shù)組,默認元素值都是零值,布爾類型是false,字符串是空字符串。
1. 未初始化的數(shù)組
package main
import "fmt"
func main() {
var a [2]bool
var b [2]int
var c [3]string
var d [3]float32
fmt.Printf("a: %v\n", a)
fmt.Printf("b: %v\n", b)
fmt.Printf("c: %v\n", c)
fmt.Printf("d: %v\n", d)
}
//輸出結果如下
a: [false false]
b: [0 0]
c: [ ]
d: [0 0 0]2. 使用初始化列表
package main
import "fmt"
func main() {
var a = [3]int{1, 2, 3}
var b = [2]string{"hello world"}
var c = [2]bool{true, false}
a1 := [2]int{1, 2} //類型推斷
fmt.Printf("a: %v\n", a)
fmt.Printf("b: %v\n", b)
fmt.Printf("c: %v\n", c)
fmt.Printf("a1: %v\n", a1)
}
//輸出結果如下
a: [1 2 3]
b: [hello world ]
c: [true false]
a1: [1 2]使用初始化列表,就是將值寫在大括號里面
3. 省略數(shù)組長度
如果數(shù)組長度不確定,可以使用 ...代替數(shù)組的長度,編譯器會根據(jù)元素個數(shù)自行推斷數(shù)組的長度
package main
import "fmt"
func main() {
var a = [...]int{1, 2, 3, 4, 5}
var b = [...]string{"hello", "world", "hello", "go"}
var c = [...]bool{true, false}
a1 := [...]int{1, 2} //類型推斷
fmt.Printf("a: %v\n", a)
fmt.Printf("b: %v\n", b)
fmt.Printf("c: %v\n", c)
fmt.Printf("a1: %v\n", a1)
}
//輸出結果如下
a: [1 2 3 4 5]
b: [hello world hello go]
c: [true false]
a1: [1 2]4. 指定索引值的方式來初始化
可以通過指定所有方式來初始化,未指定的所有默認值為零值
package main
import "fmt"
func main() {
var a = [...]int{0: 1, 2: 2}
var b = [...]string{1: "hello", 2: "go"}
var c = [...]bool{2: true, 5: false}
a1 := [...]int{1, 2} //類型推斷
fmt.Printf("a: %v\n", a)
fmt.Printf("b: %v\n", b)
fmt.Printf("c: %v\n", c)
fmt.Printf("a1: %v\n", a1)
}
//輸出結果如下
a: [1 0 2]
b: [ hello go]
c: [false false true false false false]
a1: [1 2]總結
初始化數(shù)組中{}中的元素個數(shù)不能大于[]中的數(shù)字。
如果忽略[]中的數(shù)字不設置數(shù)組大小,Go 語言會根據(jù)元素的個數(shù)來設置數(shù)組的大?。?/p>
5. 訪問數(shù)組元素
數(shù)組元素可以通過索引(位置)來讀取。
格式為數(shù)組名后加中括號,中括號中為索引的值。數(shù)組的最大下標為數(shù)組長度-1,大于這個下標會發(fā)生數(shù)組越界。
示例
package main
import "fmt"
func main() {
var a [2]int
a[0] = 100
a[1] = 200
fmt.Printf("a[0]: %v\n", a[0])
fmt.Printf("a[1]: %v\n", a[1])
//對數(shù)組進行修改
a[0] = 1
a[1] = 2
fmt.Println("---------修改后--------")
fmt.Printf("a[0]: %v\n", a[0])
fmt.Printf("a[1]: %v\n", a[1])
}
//輸出結果如下
a[0]: 100
a[1]: 200
---------修改后--------
a[0]: 1
a[1]: 2
6. 根據(jù)數(shù)組長度遍歷數(shù)組
可以根據(jù)數(shù)組長度,通過for循環(huán)的方式來遍歷數(shù)組,數(shù)組的長度可以使用len函數(shù)獲得
使用len()函數(shù)獲取數(shù)組的長度
package main
import "fmt"
func main() {
var a1 = [3]int{1, 2, 3}
fmt.Printf("len(a1): %v\n", len(a1))
var a2 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Printf("len(a2): %v\n", len(a2))
}
//輸出結果如下
len(a1): 3
len(a2): 9數(shù)組遍歷,根據(jù)長度和下標
package main
import "fmt"
func main() {
a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for i := 0; i < len(a); i++ {
fmt.Printf("a[%d]:%v\n", i, a[i])
}
}
//輸出結果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9使用for range
package main
import "fmt"
func main() {
var a = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for i, v := range a { //i也可以使用空白標識符代替,不接受索引的值
fmt.Printf("a[%v]:%v\n", i, v)
}
}
//輸出結果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9三. 訪問數(shù)組元素
1. 訪問數(shù)組元素
- 數(shù)組元素可以通過索引(位置)來讀取。
- 格式為數(shù)組名后加中括號,中括號中為索引的值。數(shù)組的最大下標為數(shù)組長度-1,大于這個下標會發(fā)生數(shù)組越界。
示例 ①
package main
import "fmt"
func main() {
var a [2]int
a[0] = 100
a[1] = 200
fmt.Printf("a[0]: %v\n", a[0])
fmt.Printf("a[1]: %v\n", a[1])
//對數(shù)組進行修改
a[0] = 1
a[1] = 2
fmt.Println("---------修改后--------")
fmt.Printf("a[0]: %v\n", a[0])
fmt.Printf("a[1]: %v\n", a[1])
}
//輸出結果如下
a[0]: 100
a[1]: 200
---------修改后--------
a[0]: 1
a[1]: 2
示例 ②
package main
import "fmt"
func main() {
//聲明數(shù)組的同時快速初始化數(shù)組
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//輸出數(shù)組元素
for i := 0; i < 5; i++ {
fmt.Printf("balance[i]: %f\n", balance[i])
}
//輸出每個數(shù)組元素的值
balance2 := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
for x := 0; x < 5; x++ {
fmt.Printf("balance2[x]: %f\n", balance2[x])
}
//將索引為1和3的元素初始化
balance3 := [5]float32{1: 2.0, 3: 7.0}
for y := 0; y < 5; y++ {
fmt.Printf("balance3: %f\n", balance3[y])
}
}
//輸出結果如下
balance[i]: 1000.000000
balance[i]: 2.000000
balance[i]: 3.400000
balance[i]: 7.000000
balance[i]: 50.000000
balance2[x]: 1000.000000
balance2[x]: 2.000000
balance2[x]: 3.400000
balance2[x]: 7.000000
balance2[x]: 50.000000
balance3: 0.000000
balance3: 2.000000
balance3: 0.000000
balance3: 7.000000
balance3: 0.0000002. 根據(jù)數(shù)組長度遍歷數(shù)組
可以根據(jù)數(shù)組長度,通過for循環(huán)的方式來遍歷數(shù)組,數(shù)組的長度可以使用len函數(shù)獲得
使用len()函數(shù)獲取數(shù)組的長度
package main
import "fmt"
func main() {
var a1 = [3]int{1, 2, 3}
fmt.Printf("len(a1): %v\n", len(a1))
var a2 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Printf("len(a2): %v\n", len(a2))
}
//輸出結果如下
len(a1): 3
len(a2): 9數(shù)組遍歷,根據(jù)長度和下標
package main
import "fmt"
func main() {
a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for i := 0; i < len(a); i++ {
fmt.Printf("a[%d]:%v\n", i, a[i])
}
}
//輸出結果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9使用for range
package main
import "fmt"
func main() {
var a = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for i, v := range a { //i也可以使用空白標識符代替,不接受索引的值
fmt.Printf("a[%v]:%v\n", i, v)
}
}
//輸出結果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9四、冒泡排序
1. 控制臺輸入十名學生的成績,如果低于60自動修改為60,并最終展示成績清單
package main
import "fmt"
func main() {
var source [10]float32 //分數(shù)
var s float32 //初始化成績
//遍歷數(shù)組
for i := 0; i < 10; i++ {
fmt.Printf("請輸入第%d學生的成績:", i+1)
fmt.Scan(&s)
if s < 60 {
//修改為60分
source[i] = 60
} else {
//添加學生成績
source[i] = s
}
}
fmt.Println("成績錄入成功!")
fmt.Println("成績清單如下")
for j := 0; j < 10; j++ {
fmt.Printf("第%d名學生的成績", j+1)
fmt.Println(source[j])
}
}
//終端輸入結果
PS D:\goproject\src\dev_code\day10\test\main> go run .\
請輸入第1學生的成績:50
請輸入第2學生的成績:55
請輸入第3學生的成績:80
請輸入第4學生的成績:70
請輸入第5學生的成績:90
請輸入第6學生的成績:50
請輸入第7學生的成績:30
請輸入第8學生的成績:44
請輸入第9學生的成績:55
請輸入第10學生的成績:66
成績錄入成功!
成績清單如下
第1名學生的成績60
第2名學生的成績60
第3名學生的成績80
第4名學生的成績70
第5名學生的成績90
第6名學生的成績60
第7名學生的成績60
第8名學生的成績60
第9名學生的成績60
第10名學生的成績662. 隨機輸入5個數(shù)字,求出最大值
package main
import (
"fmt"
)
func main() {
var (
tmp int //用來接收比較出來最大的那個數(shù)字
num int //錄入的數(shù)字
numbers [5]int //5個數(shù)字
)
for i := 0; i < 5; i++ {
fmt.Printf("請輸入第%d個數(shù)字:", i+1)
fmt.Scan(&num)
//輸入的數(shù)字添加到集合中
numbers[i] = num
}
fmt.Println("錄入成功!")
tmp = numbers[0]
for j := 0; j < 5; j++ {
//比較最大的數(shù),大的那個數(shù)用tmp來接收保存,循環(huán)的進行比較
if numbers[j] > tmp { //如果是求最小值,把>改為<即可
tmp = numbers[j]
}
}
fmt.Println("最大值:", tmp)
}
//終端輸入結果如下
PS D:\goproject\src\dev_code\day10\test\main> go run .\
請輸入第1個數(shù)字:888
請輸入第2個數(shù)字:756
請輸入第3個數(shù)字:358
請輸入第4個數(shù)字:218
請輸入第5個數(shù)字:8489
錄入成功!
最大值: 84893. 冒泡排序
思路
- 冒泡排序要對一個列表多次重復遍歷。它要比較相鄰的兩項,并且交換順序排錯的項,每對列表進行一次遍歷,就有一個最大項排在了正確的位置。
- 列表的每一個數(shù)據(jù)項都會在其相應的位置
冒泡。如果列表有n項,第一次遍歷就要比較n-1對數(shù)據(jù)。 - 一旦列表中最大的數(shù)是所比較的數(shù)據(jù)對中的一個,它就會沿著列表一直后移,直到這次遍歷結束

package main
import "fmt"
var arr = [...]int{34, 61, 22, 75, 42}
func main() {
fmt.Println("初始值為:", arr)
//外循環(huán)控制比較的輪數(shù)
for j := 0; j < len(arr)-1; j++ {
//內(nèi)循環(huán)控制比較的次數(shù)
for i := 0; i < len(arr)-j-1; i++ { //內(nèi)層的每輪比較的次數(shù)都-1次
if arr[i] > arr[i+1] {
//兩數(shù)比較以后進行位置交換
arr[i], arr[i+1] = arr[i+1], arr[i]
}
}
}
fmt.Println("----排序結束----")
fmt.Println(arr)
}
//輸出結果如下
初始值為: [34 61 22 75 42]
----排序結束----
[22 34 42 61 75]控制臺隨機輸入幾個數(shù),進行冒泡排序
package main
import "fmt"
var (
numbers int //指定輸入的數(shù)
arr = []int{} //空數(shù)組
)
func main() {
for i := 0; i < 5; i++ {
fmt.Printf("請輸入第%d個數(shù)字:", i+1)
fmt.Scan(&numbers)
arr = append(arr, numbers) //使用append進行添加數(shù)組元素
fmt.Println("添加成功")
}
fmt.Println("初始值為:", arr)
//外循環(huán)控制比較的輪數(shù)
for j := 0; j < len(arr)-1; j++ {
//內(nèi)循環(huán)控制比較的次數(shù)
for i := 0; i < len(arr)-j-1; i++ { //內(nèi)層的每輪比較的次數(shù)都-1次
if arr[i] > arr[i+1] {
//兩數(shù)比較以后進行位置交換
arr[i], arr[i+1] = arr[i+1], arr[i]
}
}
}
fmt.Println("----排序結束----")
fmt.Println(arr)
}
//輸出結果如下
請輸入第1個數(shù)字:88
添加成功
請輸入第2個數(shù)字:99
添加成功
請輸入第3個數(shù)字:50
添加成功
請輸入第4個數(shù)字:146
添加成功
請輸入第5個數(shù)字:48
添加成功
初始值為: [88 99 50 146 48]
----排序結束----
[48 50 88 99 146]五、多維數(shù)組
Go 語言支持多維數(shù)組,如下
//常用的多維數(shù)組聲明方式: var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
//三維的整型數(shù)組: var threedim [5][10][4]int
1. 二維數(shù)組
二維數(shù)組是最簡單的多維數(shù)組,二維數(shù)組本質上是由一維數(shù)組組成的。
二維數(shù)組定義方式如下
var arrayName [ x ][ y ] variable_type
variable_type 為 Go 語言的數(shù)據(jù)類型,arrayName 為數(shù)組名,二維數(shù)組可認為是一個表格,x 為行,y 為列
下圖演示了一個二維數(shù)組 a 為三行四列:

二維數(shù)組中的元素可通過 a[i][j]來訪問
package main
import "fmt"
func main() {
//創(chuàng)建數(shù)組
numbers := [][]int{}
//使用 append() 函數(shù)向空的二維數(shù)組添加兩行一維數(shù)組
x := []int{1, 2, 3}
y := []int{4, 5, 6}
numbers = append(numbers, x)
numbers = append(numbers, y)
//顯示兩行數(shù)據(jù),查看二維數(shù)組中的第一個數(shù)組和第二個數(shù)組
fmt.Printf("二維數(shù)組中的第1個一維數(shù)組為: %v\n", numbers[0])
fmt.Printf("二維數(shù)組中的第1個一維數(shù)組為: %v\n", numbers[1])
fmt.Printf("二維數(shù)組中的第1個一維數(shù)組的第一個元素為: ")
fmt.Println(numbers[0][0]) //numbers[0]里面的第一個元素[0],為1
}
//輸出結果如下
二維數(shù)組中的第1個一維數(shù)組為: [1 2 3]
二維數(shù)組中的第1個一維數(shù)組為: [4 5 6]
二維數(shù)組中的第1個一維數(shù)組的第一個元素為: 12. 初始化二維數(shù)組
多維數(shù)組可通過大括號來初始值,以下為一個3行4列的二維數(shù)組
a := [3][4]int {
{0,1,2,3}, //第1行索引為0
{4,5,6,7}, //第2行索引為1
{8,9,10,11}, //第3行索引為2
}注意,上面的代碼中倒數(shù)第二行的 }必須有逗號,因為最后一行的 }不能單獨一行,也可以寫成下面這樣
a := [3][4]int {
{0,1,2,3}, //第1行索引為0
{4,5,6,7}, //第2行索引為1
{8,9,10,11}} //第3行索引為2示例,初始化一個2行2列的二維數(shù)組
package main
import "fmt"
func main() {
//創(chuàng)建二維數(shù)組
list := [2][2]string{}
//向二維數(shù)組中添加元素
list[0][0] = "你好" //第1個一維數(shù)組中的第1個元素
list[0][1] = "歡迎" //第1個一維數(shù)組中的第2個元素
list[1][0] = "來到" //第2個一維數(shù)組中的第1個元素
list[1][1] = "南京" //第2個一維數(shù)組中的第2個元素
//輸出結果
fmt.Println(list)
}
//輸出結果如下
[[你好 歡迎] [來到 南京]]3. 訪問二維數(shù)組
二維數(shù)組通過指定坐標來訪問。如數(shù)組中的行索引與列索引,例如:
//訪問二維數(shù)組 val 第三行的第四個元素 val := a[2][3] //或 var value int = a[2][3]
二維數(shù)組可以使用循環(huán)嵌套來輸出元素
package main
import "fmt"
func main() {
nums := [2][3]int{
{1, 2, 3},
{4, 5, 6},
}
//遍歷二維數(shù)組中的每個元素
//外層循環(huán)讀取行
for i := 0; i < 2; i++ {
//內(nèi)層循環(huán)讀取列
for j := 0; j < 3; j++ {
fmt.Println(nums[i][j])
}
}
}
//輸出結果如下
1
2
3
4
5
6創(chuàng)建各個維度元素數(shù)量不一致的多維數(shù)組
package main
import "fmt"
func main() {
// 創(chuàng)建空的二維數(shù)組
list := [][]string{}
// 創(chuàng)建三一維數(shù)組,各數(shù)組長度不同
num1 := []string{"zhang", "wang", "zhao"}
num2 := []string{"li"}
num3 := []string{"sun", "jin"}
// 使用 append() 函數(shù)將一維數(shù)組添加到二維數(shù)組中
list = append(list, num1)
list = append(list, num2)
list = append(list, num3)
// 循環(huán)輸出
for i := range list {
fmt.Printf("list: %v\n", i)
fmt.Println(list[i])
}
}
//輸出結果如下
list: 0
[zhang wang zhao]
list: 1
[li]
list: 2
[sun jin]六、向函數(shù)傳遞數(shù)組
如果想向函數(shù)傳遞數(shù)組參數(shù),需要在函數(shù)定義時,聲明形參為數(shù)組,可通過如下兩種方式來聲明:
1. 形參設定數(shù)組大小
void myFunction(param [10]int)
{
.
.
.
}2. 形參未設定數(shù)組大小
void myFunction(param []int)
{
.
.
.
}3. 示例
函數(shù)接收整形數(shù)組參數(shù),另一個參數(shù)指定了數(shù)組元素的個數(shù),并求和
package main
import "fmt"
//定義數(shù)組,有5個元素
var numbers [5]int
func main() {
numbers = [5]int{10, 20, 30, 40, 50}
fmt.Println("元素和為:", sum(numbers))
}
func sum(arr [5]int) int {
//定義求和的變量s
s := 0
//求和過程
for i := range arr {
s += arr[i]
}
return s
}
//輸出結果如下
元素和為: 150函數(shù)接收整形數(shù)組參數(shù),另一個參數(shù)指定了數(shù)組元素的個數(shù),并求出平均值
package main
import "fmt"
var (
//數(shù)組長度為5
nums = [5]int{10, 20, 40, 60, 80}
avg float32
s int
)
func main() {
//數(shù)組作為參數(shù)傳遞給函數(shù)
avg = sums(nums, len(nums))
//輸出返回的平均值
fmt.Printf("平均值為: %f", avg)
}
//傳入數(shù)組和他的長度,返回值的類型為float32
func sums(x [5]int, length int) float32 {
for i := 0; i < length; i++ {
s += x[i]
}
avg = float32(s) / float32(length)
return avg
}
//輸出結果如下
平均值為: 42.000000總結
數(shù)組的元素可以通過下標的方式來訪問,下標的最大長度為數(shù)組長度-1,如果大于這個下標則會越界
遍歷數(shù)組的兩種方法:
① 通過 for循環(huán),長度可以使用len()獲取
② 通過for range循環(huán)遍歷數(shù)組,返回數(shù)組下標和對應的值;若不想要下標,可以使用空白標識符_來取代
以上就是Go語言學習之數(shù)組的用法詳解的詳細內(nèi)容,更多關于Go語言數(shù)組的資料請關注腳本之家其它相關文章!
相關文章
gorm FirstOrCreate和受影響的行數(shù)實例
這篇文章主要介紹了gorm FirstOrCreate和受影響的行數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
go-zero創(chuàng)建RESTful API 服務的方法
文章介紹了如何使用go-zero框架和goctl工具快速創(chuàng)建RESTfulAPI服務,通過定義.api文件并使用goctl命令,可以自動生成項目結構、路由、請求和響應模型以及處理邏輯,感興趣的朋友一起看看吧2024-11-11

