Golang與數組


在這裏插入圖片描述

1. 數組概述

Go語言中 字符串 數組 切片 這三種數據類型在底層原始數據有着相同的內存結構,在上層因爲語法的限制而有着不同的行爲表象.

數組是用來存放同一類型數據的並且具有固定長度的連續內存區域,使用時可以修改數組成員,但是不能改變數組的長度.數組是一種數據類型,在Go語言是中數組是值類型.

  • 數組的長度是固定的
  • 數組中的元素類型一定是一致的
  • 數組長度是數組類型的組成部分,故不同長度和元素類型的數組是不同的類型
  • 理解數組是理解切片的基礎
  • Go語言中數組是值語義,一個數組變量表示整個數組

當需要詳細規劃程序所使用的內存時,數組類型非常有用, 使用數組值可以避免耗時費力的內存二次分配操作

package main

import "fmt"

func main() {
	var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
	L := len(week)
	for i := 0; i < L; i++ {
        // 觀察輸出的各個數組元素的內存地址
		fmt.Println(&week[i])
	}
}

$ go run main.go
0xc000084000
0xc000084010
0xc000084020
0xc000084030
0xc000084040
0xc000084050
0xc000084060
0xc000084070

2. 數組聲明

數組的聲明寫法如下 :

var 數組名 [數組長度]T

  • 數組名 : 就是數組在使用的時候的變量名
  • 數組長度 : 數組定義時,最多允許的存入數組的元素的數量,可以是一個表達式,在程序編譯期計算的結果必須是一個整數,在使用前這個值是已經確定的
  • T : 表示一種數據類型, 數組的類型可以是數組,這樣就構成了多維數組
  • 長度爲0的數組在內存中不佔用空間
package main

import "fmt"

const N  = 2
func main() {

	var nArr [3]int
	var sArr [7]string
	var fArr [10]float64
	var hArr [5][1]string
	var ageArr [N * 5]int
	fmt.Println(nArr)
	fmt.Println(sArr)
	fmt.Println(fArr)
	fmt.Println(hArr)
	fmt.Println(ageArr)
}
$ go run main.go
[0 0 0]
[      ]
[0 0 0 0 0 0 0 0 0 0]
[[] [] [] [] []]
[0 0 0 0 0 0 0 0 0 0]

3. 數組初始化

數組初始化就是給數組填充一些數據

方式1:

數組在聲明是使用初始化列表進行元素設置

這種數組初始化,列表元素的個數可以比數組長度少,但是不能超過數組長度

package main

import "fmt"

func main() {
	var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
	fmt.Println(week)

}

方式2:

在編譯器編譯的時候,由編譯器根據數組元素個數自動設置數長度

[...] 方括號中的 ... 表示有Go編譯器計算該值的元素數量並以此獲取其長度

package main

import "fmt"

func main() {
	var workDay = [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}
	fmt.Println(workDay)
    var nArr = [...]int{0:9,15:900}
	fmt.Println(nArr)
}

$ go run main.go
[Monday Tuesday Wednesday Thursday Friday]
[9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 900]

方式3:

一般方法, 先聲明,後定義

package main

import "fmt"

func main() {
	var NS  [3][1]string
	NS[0][0] = "aa"
	NS[1][0] = "bb"
	NS[2][0] = "cc"
	fmt.Println(NS)
}

4. 數組遍歷

通常數組遍歷就是訪問數組中的每一個元素

方法一 for 循環遍歷

package main

import "fmt"

func main() {
	var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
	L := len(week)
	for i:=0; i<L;i++  {
		fmt.Println(i,"----",week[i])
	}
}

$ go run main.go
0 ---- _
1 ---- Monday
2 ---- Tuesday
3 ---- Wednesday
4 ---- Thursday
5 ---- Friday
6 ---- Saturday
7 ---- Sunday

方法二 for range 結構遍歷

package main

import (
	"fmt"
)

func main() {
	var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
    // k 表示數組下標 , v表示元素值
	for k,v := range week{
		fmt.Println(k,"===",v)
	}
}

$ go run main.go
0 === _
1 === Monday
2 === Tuesday
3 === Wednesday
4 === Thursday
5 === Friday
6 === Saturday
7 === Sunday

5. 數組使用說明

  • 數組聲明之後,沒有初始化數組中的元素的值都是默認值
  • 數組長度不能動態變化
  • 數組的下標都是從0開始的
  • 數組下標使用不能超過數組的長度否則數組越界,程序報錯
  • 數組屬於值類型,默認是值傳遞,拷貝的副本,值修改相互不影響
  • 在不同的函數之間,想修改原數組,可以使用引用傳遞
package main

import "fmt"

func modify(arr [8]string){
	arr[0] = "DEMO"
	fmt.Println(arr)
}
func main(){
	var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
	modify(week)
	fmt.Println(week)
}

$go run main.go
[DEMO Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
[_ Monday Tuesday Wednesday Thursday Friday Saturday Sunday]

引用傳遞

package main

import (
	"fmt"
)

func modify(arr [8]string){
	arr[0] = "DEMO"
	fmt.Println(arr)
}
func modifyCite(arr *[8]string){
	arr[1] = "星期一"
}
func main(){
	var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
	modify(week)
	// 引用傳遞
	modifyCite(&week)
	fmt.Println(week)
}

$ go run main.go
[DEMO Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
[_ 星期一 Tuesday Wednesday Thursday Friday Saturday Sunday]

練習Demo

package main

import (
	"fmt"
)

func main() {
	// 打印26字母
	var char [26]byte
	for i := 0; i < 26; i++ {
		char[i] = 'A' + byte(i)
	}
	for _, v := range char {
		fmt.Printf("%c\t", v)
	}
	//求一個數組中的最大值
	var n = [...]int{1, 9, -90, 88, 99, 8776, 23}
	maxIndex := 0
	maxValue := n[maxIndex]
	for k, v := range n {
		if v > maxValue {
			maxValue = v
			maxIndex = k
		}
	}
	fmt.Printf("\n數組n中最大值是%d,其下標是%d", maxValue, maxIndex)
	// 求出數組的平均值 數組元素值總和/ 元素個數
	L := len(n)
	sum := 0
	for i := 0; i < L; i++ {
		sum += n[i]
	}
	aver := float64(sum / L)
	fmt.Printf("\n數組n有%d個元素,平均值是%f", L, aver)
}

$ go run main.go
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	
數組n中最大值是8776,其下標是5
數組n有7個元素,平均值是1272.000000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章