Go 開發常用操作技巧 -- 數組
在 go 語言中,數組的長度是不可變的,這就導致數組在實際使用中不是很靈活,爲此,設計了動態數組 --Slice(切片)。
切片是對數組的一個連續片段的引用,所以切片是一個引用類型。其內部結構包含地址、大小和容量。
切片的創建有以下四種方式:
-
make([]Type,length,capacity)
-
make([]Type,length)
-
[]Type{}
-
[]Type{value1,value2,...}
迭代數組
Go 語言中可以使用 for range
來遍歷數組或者切片。range 會返回兩個值,一個是當前迭代的索引位置,一個是該位置對應元素值的一份副本。
示例:
package main
import (
"fmt"
)
func main() {
array := []int{1, 2, 3} //創建一個int類型切片並賦值
//遍歷,索引值如果不需要可以使用下劃線來忽略掉
for _, v := range array {
fmt.Printf("value:%d\n", v)
}
//或者使用傳統for循環遍歷
for i := 0; i < len(array); i++ {
fmt.Printf("value:%d\n", array[i])
}
}
刪除數組中的元素
Go 語言中沒有給出特定的方法來刪除數組及切片的元素,我們可以用切片的特性來刪除元素。
-
分割:以被刪除元素爲分界點,將刪除元素的前後部分分割開來
-
拼接:使用 append() 函數實現元素的拼接
示例:
package main
import "fmt"
func main() {
s := []int{1, 2, 3} //創建一個int類型切片並賦值
index := 1 //指定需要刪除的元素“2”,其索引值爲 1
s = append(s[:index],s[index+1:]...)
fmt.Println(s)
}
//運行結果
[1 3]
檢查某個值是否在數組中
需要根據對應的類型將元素進行逐個對比:
package main
import "fmt"
func Exist(target int, array []int) bool {
for _, v := range array {
if target == v {
return true
}
}
return false
}
func main() {
s := []int{1, 2, 3} //創建一個int類型切片並賦值
target := 2
res := Exist(target, s)
fmt.Println("2是否在切片s中:", res) //2是否在切片s中: true
}
查找一個元素在數組中的位置
首先通過 reflect 包的 ValueOf() 函數獲取數組的值,然後 for 循環遍歷數組對值進行對比,如果相等則返回位置的索引值。
package main
import (
"fmt"
"reflect"
)
func Position(arr interface{}, target interface{}) int {
array := reflect.ValueOf(arr)
for i := 0; i < array.Len(); i++ {
v := array.Index(i)
if v.Interface() == target {
return i
}
}
return -1
}
func main() {
s := []int{1, 2, 3} // 創建一個int類型切片並賦值
res := Position(s, 2)
fmt.Println(res) // 1
}
刪除數組中重複的元素
- 循環遍歷方式
從後向前進行遍歷,拿最後一項自後往前逐個進行比較,當遇到有相同項時移除最後一項,同時跳出比較。這裏因爲自後往前比較,下標以及總長度的問題不用處理。這是數組去重最佳的寫法,效率較高,留下的非重複項也是前面的項。
package main
import (
"fmt"
)
func Unique(arr []int) []int {
arr_len := len(arr) - 1
for ; arr_len > 0; arr_len-- {
for i := arr_len - 1; i >= 0; i-- {
if arr[arr_len] == arr[i] {
arr = append(arr[:i], arr[i+1:]...)
break
}
}
}
return arr
}
func main() {
s := []int{1, 2, 1, 2, 3} //創建一個int類型切片並賦值
res := Unique(s)
fmt.Println(res) // [1 2 3]
}
- 對於一個有序數組 arr ,需要原地刪除重複出現的元素,使每個元素只出現一次 ,不要使用額外的數組空間,並在使用 O(1) 額外空間的條件下完成。
package main
import (
"fmt"
)
func Unique(arr []int) []int {
left := 0
for right := 1; right < len(arr); right++ {
if arr[left] != arr[right] {
left++
arr[left] = arr[right]
}
}
return arr[:left+1]
}
func main() {
s := []int{1, 2, 2, 3} //創建一個int類型切片並賦值
res := Unique(s)
fmt.Println(res) // [1 2 3]
}
微信公衆號
gophpython
我的微信
wucs_dd
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/xVyABDgOUxiXss6dm1ZXYQ