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

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

在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])
  }
}
复制代码

image.png

删除数组中的元素

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
}
复制代码

删除数组中重复的元素

  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]
}
复制代码
  1. 对于一个有序数组 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]
}


相关文章
|
2月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
48 7
|
4月前
|
存储 前端开发 Go
Go语言中的数组
在 Go 语言中,数组是一种固定长度的、相同类型元素的序列。数组声明时长度已确定,不可改变,支持多种初始化方式,如使用 `var` 关键字、短变量声明、省略号 `...` 推断长度等。数组内存布局连续,可通过索引高效访问。遍历数组常用 `for` 循环和 `range` 关键字。
|
2月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
121 67
|
6月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
2月前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
3月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
54 3
|
3月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
47 3
|
3月前
|
Java Go 数据处理
go语言使用切片而非数组
【10月更文挑战第18天】
24 1
|
5月前
|
编译器 Go 索引
Go to Learn Go之数组
Go to Learn Go之数组
45 0
|
5月前
|
编译器 Go 索引
Go数组、多维数组和切片(动态数组),及常用函数len(),cap(),copy(),append()在切片中的使用
本文介绍了Go语言中数组、多维数组和切片(动态数组)的基本概念和操作,包括数组的定义、初始化、访问,多维数组的定义和访问,以及切片的创建、使用和扩容。同时,还讲解了切片中常用的函数len()、cap()、copy()和append()的使用方法。

热门文章

最新文章