Go 开发常用操作技巧--数组
2023-06-13 09:16:38 时间
在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]
}
图片及部分相关技术知识点来源于网络搜索,侵权删!
相关文章
- Go Channel(收藏以备面试)
- Go 编程 | 连载 25 - Go 的 defer 语句
- Go 数据结构和算法篇(十四):哈希表、哈希函数、哈希冲突和哈希算法
- Go语言中常见100问题-#1 Unintended variable shadowing
- go语言学习之读取用户输入
- Go常见错误集锦之append操作slice时的副作用
- 「Go框架」深入理解iris框架的路由底层结构
- Go-包管理-go mod(二)
- Go语言接口和类型之间的转换
- Go从入门到精通(一)go语言初识详解编程语言
- Linux上构建Go开发环境(linux安装go环境)
- 一步一步学习Go读取Oracle数据库(go读取oracle)
- 前行不止Go语言监听Oracle日志(go监听oracle日志)
- 给Oracle数据库添加专业技能,Go大发展(go_db_oracle)
- ODBC数据驱动程序连接Oracle数据库Go语言之旅(go使用oracle)
- 语句使用Oracle中的Go语句来简化编程(oracle中go)