1. 程式人生 > >一起來學GO語言3--GO語言資料型別

一起來學GO語言3--GO語言資料型別

GO語言中的資料型別很多,有整型、浮點型、複數型、布林型、字元型、陣列、map等等,這裡說幾種我認為比較有意義的。

1、字串

字串是一個不可變的字元序列。它可以包含任何資料。

內建函式len

s := "abcdef"
fmt.Println(len(s))

得到結果:6

子串生成操作 str := s[i:j],i為起始位置,j為結束為止,結果是一個j-i的字串

s := "abcdef"
fmt.Println(s[:2], s[2:3], s[:])  //ab c abcdef

因為字串不可改變,所以字串內部的資料不允許修改,因此以下操作會報錯

s[1] = "m"

2、常量生成器iota

常量的宣告可以使用常量生成器iota,它建立一系列相關值,iota從0開始取值,逐項加1,用一段程式碼來說明

const (
	zero  = iota //0
	one          //1
	two          //2
	three        //3
	four         //4
	fiver        //5
)

2、陣列

陣列是具有固定瘡毒且擁有0個或多個相同資料型別的元素序列。對陣列的訪問是通過索引來進行訪問的,索引從0開始到資料的長度減一,資料的長度可以使用函式len來進行獲取,下面來看一段程式碼:

arr := [6]int{0, 1, 2, 3, 4, 5}
fmt.Println(arr)
//遍歷輸出陣列,輸出索引和值
for i, v := range arr {
	fmt.Printf("index=%d value=%d\n", i, v)
}
//遍歷陣列,只輸出值
for _, v := range arr {
	fmt.Printf("value=%d\n", v)
}

3、slice(切片)

slice表示一個擁有相同型別元素的可邊長序列(陣列的長度是不可變的), slice通常寫成[]T。

宣告一個數組:

arr := [...]int{0, 1, 2, 3, 4, 5}

建立一個slice:

arr := [...]int{0, 1, 2, 3, 4, 5}
demo := arr[:]
fmt.Printf("slice=%v,len=%d, cap=%d\n", demo, len(demo), cap(demo))  //slice=[0 1 2 3 4 5],len=6, cap=6

slice的引用如果超過的陣列的範圍,會出現異常, 例如:

arr := [...]int{0, 1, 2, 3, 4, 5}
demo := arr[:10]

 程式報錯:

slice有三個屬性:指標、長度和容量,slice看起來和陣列很像,slice就像是陣列的一個別名,下面用一段程式碼來感受下兩個之間的區別:

package main

import (
	"fmt"
)

//反轉slice
func reverseSlice(s []int) []int {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
	return s
}

//反轉陣列
func reverseArray(s [6]int) [6]int {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
	return s
}

func main() {
	arr1 := [...]int{0, 1, 2, 3, 4, 5}
	arr2 := [...]int{0, 1, 2, 3, 4, 5}
	fmt.Println(arr1 == arr2)   //陣列可以直接進行比較
	s := reverseArray(arr1)  //反轉陣列,陣列必須是長度一定的[m]T,m為定值
	fmt.Println(s)
	demo1 := arr1[:]
	s1 := reverseSlice(demo1)  //反轉切片,切片的定義是[]T,沒有長度
	fmt.Println(s1)
	//demo2 := arr1[:]
	//fmt.Println(demo1 == demo2)  //切片不能進行比較

}

程式執行結果為:

 上面程式碼中註釋掉的程式碼大家可以放開試試,想想為什麼會報錯,還有上面有兩個反轉的函式,這兩個函式大家也可以互換一下看看結果,想想這樣可以更進一步的理解陣列和slice的區別

這裡在說一點,可以使用內建函式make來建立一個指定長度和容量的slice,其中容量引數可以忽略

arr1 := make([]int, 5, 8)  //len=5, cap=8
arr2 := make([]int, 5)  //len=5, cap=5 這裡忽略了cap引數,預設cap=len