前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 开发常用操作技巧--数组

Go 开发常用操作技巧--数组

作者头像
微客鸟窝
发布2023-01-09 19:18:25
4220
发布2023-01-09 19:18:25
举报
文章被收录于专栏:Go语言指北Go语言指北

在go语言中,数组的长度是不可变的,这就导致数组在实际使用中不是很灵活,为此,设计了动态数组--Slice(切片)。

切片是对数组的一个连续片段的引用,所以切片是一个引用类型。其内部结构包含地址、大小和容量。

切片的创建有以下四种方式:

  • make([]Type,length,capacity)
  • make([]Type,length)
  • []Type{}
  • []Type{value1,value2,...}

迭代数组

Go 语言中可以使用 for range 来遍历数组或者切片。range 会返回两个值,一个是当前迭代的索引位置,一个是该位置对应元素值的一份副本。

示例:

代码语言:javascript
复制
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() 函数实现元素的拼接

示例:

代码语言:javascript
复制
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]

检查某个值是否在数组中

需要根据对应的类型将元素进行逐个对比:

代码语言:javascript
复制
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 循环遍历数组对值进行对比,如果相等则返回位置的索引值。

代码语言:javascript
复制
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
}

删除数组中重复的元素

  1. 循环遍历方式

从后向前进行遍历,拿最后一项自后往前逐个进行比较,当遇到有相同项时移除最后一项,同时跳出比较。这里因为自后往前比较,下标以及总长度的问题不用处理。这是数组去重最佳的写法,效率较高,留下的非重复项也是前面的项。

代码语言:javascript
复制
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]
}
  1. 对于一个有序数组 arr ,需要原地删除重复出现的元素,使每个元素只出现一次 ,不要使用额外的数组空间,并在使用 O(1) 额外空间的条件下完成。
代码语言:javascript
复制
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]
}

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迭代数组
  • 删除数组中的元素
  • 检查某个值是否在数组中
  • 查找一个元素在数组中的位置
  • 删除数组中重复的元素
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档