golang 學習之語言切片Slice Range範圍 MAP 遞迴函式
阿新 • • 發佈:2018-12-10
Go 語言切片是對陣列的抽象。
Go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內建型別切片(“動態陣列”),與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。
- 定義一個未指定大小的切片
var identifier []type
或者用make()函式來建立切片var slice1 []type = make([]type, len)
或者簡寫為slice1 := make([]type, len)
- 指定容量,capacity引數可選
make([]T, length, capacity)
- 切片初始化
s :=[] int {1,2,3 }
s :=[] int {1,2,3 }
初始化切片s,是陣列arr的引用
s := arr[:]
將arr中從下標startIndex到endIndex-1 下的元素建立為一個新的切片
s := arr[startIndex:endIndex]
將arr中從下標startIndex到最後一個元素建立為一個新的切片
s := arr[startIndex:]
預設startIndex時將表示從arr的第一個元素開始
s := arr[:endIndex]
s1 := s[startIndex:endIndex]
通過切片s初始化切片s1
s :=make([]int ,len,cap)
通過內建函式make()初始化切片s,[]int 標識為其元素型別為int的切片
- len() 和 cap() 函式分別測陣列的長度和最長能達到多少
- 個切片在未初始化之前預設為 nil,長度為 0,cap為0
- 切片擷取
numbers := []int{0,1,2,3,4,5,6,7,8}
/* 列印子切片從索引1(包含) 到索引4(不包含)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
- append() 和 copy() 函式 如果想增加切片的容量,我們必須建立一個新的更大的切片並把原分片的內容都拷貝過來。
func main() {
var numbers []int
printSlice(numbers)
/* 允許追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
/* 向切片新增一個元素 */
numbers = append(numbers, 1)
printSlice(numbers)
/* 同時新增多個元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* 建立切片 numbers1 是之前切片的兩倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷貝 numbers 的內容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
- range Go 語言中 range 關鍵字用於 for 迴圈中迭代陣列(array)、切片(slice)、通道(channel)或集合(map)的元素。在陣列和切片中它返回元素的索引和索引對應的值,在集合中返回 key-value 對的 key 值。
package main
import "fmt"
func main() {
//這是我們使用range去求一個slice的和。使用陣列跟這個很類似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
//如果將for後面的_去掉,結果是6
//這是因為 for _ 表示遍歷陣列的下標,從nums[0],nums[1],nums[2]依次開始遍歷,
//所以最後的值為sum=2+3+4=9;但是如果把 for _ 去掉,就變成了遍歷0 1 2,所以sum=0+1+2=3。
sum += num
}
fmt.Println("sum:", sum)
//在陣列上使用range將傳入index和值兩個變數。上面那個例子我們不需要使用該元素的序號,所以我們使用空白符"_"省略了。有時侯我們確實需要知道它的索引。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range也可以用在map的鍵值對上。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用來列舉Unicode字串。第一個引數是字元的索引,第二個是字元(Unicode的值)本身。
for i, c := range "go" {
//這段程式碼中 i 表示陣列小標,從0開始計數,c表示字元所對應的ASCII值,
//所以遍歷 [hello]這個字元陣列,得到了每個陣列下標下的字元所對應的ASCII值。
fmt.Println(i, c)
}
}
- 集合 1.map建立
//make()函式建立
var mymap map[string]string /*建立集合 */
mymap = make(map[string]string)
map關鍵字建立
mymap := map[string]string{"France": "Paris", "Italy": "Rome",
"Japan": "Tokyo", "India": "New delhi"}
- 向map中新增資料
mymap [ "France" ] = "Paris"
mymap [ "Italy" ] = "羅馬"
mymap [ "Japan" ] = "東京"
mymap [ "India " ] = "新德里"
- map的遍歷
/*使用鍵輸出地圖值 */ for country := range countryCapitalMap {
fmt.Println(country, "首都是", mymap [country])
}
- 刪除元素
delete(mymap , "France")
- 遞迴函式
func recursion() {
recursion() /* 函式呼叫自身 */
}
func main() {
recursion()
}
- go語言遞迴函式應用
package main
import "fmt"
func Factorial(n uint64)(result uint64) {
if (n > 0) {
result = n * Factorial(n-1)
return result
}
return 1
}
func main() {
var i int = 15
fmt.Printf("%d 的階乘是 %d\n", i, Factorial(uint64(i)))
}
sout : 15 的階乘是 1307674368000