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]
}


相关文章
|
3天前
|
Go
go语言数组与切片
go语言数组与切片
13 0
|
9天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
18天前
|
存储 前端开发 中间件
Go Web 开发 Demo【用户登录、注册、验证】(3)
Go Web 开发 Demo【用户登录、注册、验证】
|
18天前
|
前端开发 数据库连接 Go
Go Web 开发 Demo【用户登录、注册、验证】(1)
Go Web 开发 Demo【用户登录、注册、验证】
|
30天前
|
编译器 Go 索引
Go 语言数组
Go 语言数组
15 1
|
9天前
|
存储 Go 开发工具
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
|
9天前
|
JSON 算法 Go
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
|
1月前
|
缓存 负载均衡 网络协议
使用Go语言开发高性能服务的深度解析
【5月更文挑战第21天】本文深入探讨了使用Go语言开发高性能服务的技巧,强调了Go的并发性能、内存管理和网络编程优势。关键点包括:1) 利用goroutine和channel进行并发处理,通过goroutine池优化资源;2) 注意内存管理,减少不必要的分配和释放,使用pprof分析;3) 使用非阻塞I/O和连接池提升网络性能,结合HTTP/2和负载均衡技术;4) 通过性能分析、代码优化、缓存和压缩等手段进一步提升服务性能。掌握这些技术能帮助开发者构建更高效稳定的服务。
|
18天前
|
JSON 前端开发 Java
Go Web 开发 Demo【用户登录、注册、验证】(4)
Go Web 开发 Demo【用户登录、注册、验证】
|
18天前
|
Go 数据库
Go Web 开发 Demo【用户登录、注册、验证】(2)
Go Web 开发 Demo【用户登录、注册、验证】