golang切片反序实例

 更新时间:2020年12月16日 16:25:07   作者:思维的深度  
这篇文章主要介绍了golang切片反序实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

看代码吧~

package main
import (
 "fmt"
)
func main() {
 fmt.Println(reverse([]byte{11,22,33,44}))
}
func reverse(s []byte) []byte {
 for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
 s[i], s[j] = s[j], s[i]
 }
 return s
}

补充:golang切片内存应用技巧

在 Go 语言中切片是使用非常频繁的一种聚合类型,它代表变长的序列,底层引用一个数组对象。

一个切片由三个部分构成:指针、长度和容量。

指针指向该切片自己第一个元素对应的底层数组元素的内存地址。

切片的类型声明如下:

type slice struct {
 array unsafe.Pointer
 len  int
 cap  int
}

多个切片之间可以共享底层数组的数据,并且引用的数组区间可能重叠。利用切片 的这个特性我们可以在原有内存空间中对切片进行反转、筛选和去重等操作,这样就不用声明一个指向新内存的切片来存储结果,从而节省了内存空间以及扩展底层数组的消耗,这在切片长度足够大时效果就会非常显著。

下面这些例子都是在切片底层数组的内存空间上进行的操作,需要注意的是这些操作在底层数组上生成新切片的同时也会更改底层数组。

删除指定位置的元素

下面的函数从原切片中删除索引位置i上的元素

func remove(slice []int, i int) []int {
  copy(slice[i:], slice[i+1:])
  return slice[:len(slice)-1]
}
 
func main() {
  s := []int{5, 6, 7, 8, 9}
  fmt.Println(remove(s, 2)) // "[5 6 8 9]"
}

内置的copy函数可以方便地将一个切片复制另一个相同类型的切片上。

筛选元素

下面的函数从输入的源切片中筛选出满足条件的切片元素,返回一个满足条件的元素组成的新切片。

type funcType func(T) bool //代表筛选逻辑函数,可以按需实现
 
func filter(a []T, f funcType) []T {
  b := a[:0]
  for _, x := range a {
    if f(x) { 
      b = append(b, x)
    }
  }
  return b
}

反转切片

func reverse(a []T) []T {
  for i := len(a)/2-1; i >= 0; i-- {
    opp := len(a)-1-i
    a[i], a[opp] = a[opp], a[i]
  }    
  return a
}

分组切片

下面的函数接收一个[]int 类型的源切片actions, 返回一个按指定长度分组的嵌套切片(解释起来好难,用过PHP 的同学可以理解为 Go 版本的array_chunk 函数,没用过的看下面例子)。

假设切面值为:[]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},设置分组中元素长度batchSize为3,函数调用后返回的分组后的切片为[[0 1 2] [3 4 5] [6 7 8] [9]]

func chunk(actions []int, batchSize int) []int {
  var batches [][]int
 
  for batchSize < len(actions) {
    actions, batches = actions[batchSize:], append(batches, actions[0:batchSize:batchSize])
  }
  batches = append(batches, actions)    
  return batches
}
 
func main() {
  actions := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  batchSize := 3
  chunks = chunk(actions, batchSize)
  //chunks 为[[0 1 2] [3 4 5] [6 7 8] [9]]
}

这里顺便说一下,完整的切片表达式形式如下:

input[low:high:max]

最后一个 max 的作用是,生成的切片的cap(容量)为max - low。

原地去重(只针对可比较的切片类型)

import "sort"
 
func main() {
  in := []int{3,2,1,4,3,2,1,4,1} // any item can be sorted
  sort.Ints(in)
  j := 0
  for i := 1; i < len(in); i++ {
    if in[j] == in[i] {
      continue
    }
    j++
 
    in[j] = in[i]
  }
  result := in[:j+1]
  fmt.Println(result) // [1 2 3 4] 
}

文章中部分例子来自golang 官方的 GitHub 的 wiki ,在这个 wiki 里介绍了很多的切片使用技巧,了解更多可以访问golang 的 GitHub Wiki https://github.com/golang/go/...

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 深入解析golang bufio

    深入解析golang bufio

    这篇文章主要介绍了golang bufio解析,golang的bufio库使用缓存来一次性进行大块数据的读写,以此降低IO系统调用,提升性能,需要的朋友可以参考下
    2022-04-04
  • 轻松入门:使用Golang开发跨平台GUI应用

    轻松入门:使用Golang开发跨平台GUI应用

    Golang是一种强大的编程语言,它的并发性和高性能使其成为开发GUI桌面应用的理想选择,Golang提供了丰富的标准库和第三方库,可以轻松地创建跨平台的GUI应用程序,通过使用Golang的GUI库,开发人员可以快速构建具有丰富用户界面和交互功能的应用程序,需要的朋友可以参考下
    2023-10-10
  • Go语言题解LeetCode599两个列表的最小索引总和

    Go语言题解LeetCode599两个列表的最小索引总和

    这篇文章主要为大家介绍了Go语言题解LeetCode599两个列表的最小索引总和示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • go1.8之安装配置具体步骤

    go1.8之安装配置具体步骤

    下面小编就为大家带来一篇go1.8之安装配置具体步骤。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Go语言中序列化与反序列化示例详解

    Go语言中序列化与反序列化示例详解

    我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,Go语言当然也支持所有这些编码格式,下面这篇文章主要给大家介绍了关于Go语言中序列化与反序列化的相关资料,需要的朋友可以参考下
    2022-07-07
  • 浅析Go语言编程当中映射和方法的基本使用

    浅析Go语言编程当中映射和方法的基本使用

    这篇文章主要介绍了浅析Go语言编程当中映射和方法的基本使用,是golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 关于go语言载入json可能遇到的一个坑

    关于go语言载入json可能遇到的一个坑

    Go 语言从新手到大神,每个人多少都会踩一些坑,那么下面这篇文章主要给大家介绍了关于go语言载入json可能遇到的一个坑,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • VS Code配置Go语言开发环境的详细教程

    VS Code配置Go语言开发环境的详细教程

    这篇文章主要介绍了VS Code配置Go语言开发环境的详细教程,本文通过实例代码图文相结合的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • go语言面试如何实现自旋锁?

    go语言面试如何实现自旋锁?

    这篇文章主要为大家介绍了go语言面试中常问的如何实现自旋锁问题实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Golang常用包使用介绍

    Golang常用包使用介绍

    标准的Go语言代码库中包含了大量的包,并且在安装Go的时候多数会自动安装到系统中。我们可以在$GOROOT/src/pkg目录中查看这些包。下面简单介绍一些我们开发中常用的包
    2022-09-09

最新评论