• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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二维切片初始化的实现
    • golang切片扩容规则实现
    • golang修改结构体中的切片值方法
    • golang 切片截取参数方法详解
    • golang 字符串切片去重实例
    • golang将切片或数组根据某个字段进行分组操作
    • golang 删除切片的某个元素及剔除切片内的零值方式
    上一篇:golang 实现interface{}转其他类型操作
    下一篇:golang指数运算操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang切片反序实例 golang,切片,反序,实例,golang,