【转】 golang slice array

1. array
  同一类型数据的集合
    var arr [n]type    //声明type类型一维数组
    var arr [m][n]type //声明type类型二维数组
    多维数组以此类推
    也可以用 := 声明
    arr := [n]type{元素1[,元素2, ...]} 其中n可以用 "..." 三个点表示,系统会根据元素个数来确定
  下标只能为 int 类型,而 php 还支持 string 类型的下标
  1.1 数组长度 len(arr)
    注:数组长度在定义后就不可变
  1.2 遍历:
    a
. 循环通过过数组下标访问 arr[0] ~ arr[(len(arr))]
    b. range arr, 有两个返回值 第一个为数组下标,第二个为元素的值,与php遍历数组相似

[plain] view plaincopyprint?

  1. for k, v := range array {
  2. fmt.Printf("arr[%d] = %d \t", k, v)
  3. }

[php] view plaincopyprint?

  1. foreach ($arr as $k => $v) {
  2. printf("arr[%d] = %d \t", $k, $v);
  3. //echo ‘$arr[‘ . $k . "] = " . $v . "\t";
  4. }

1.3 数组在赋值与传递参数时,都会产生一个数组副本,而不是使用它的指针

2. slice
  在定义 array 时,其长度是固定的,并且 array 是一个值类型
  而 slice 是一个可变的数组,但是一个引用类型
  2.1 产生slice的三种方式
    a
. 声明与 array 一样,不过不需要指定长度
    var slice1 []int
    slice2 := []int {元素1[, 元素2, ...]}
    b. 从数组(或者切片或者字符串)中获取 arr[i:j] i=数组的开始位置,j=结束位结果,j-i=切片的长度,i和j都可以省略,省略时 i=0, j=len(arr),i是从0开始,j是从1开始
      a b c d e f
    i 0 1 2 3 4 5
    j 1 2 3 4 5 6

[plain] view plaincopyprint?

  1. slice1 := arr[:]    //arr[0:6]/arr[0:]
  2. slice2 := arr[1:1]  //[]
  3. slice4 := arr3[1:3] //b c
  4. slice5 := arr3[:5]  // = arr3[0:5]

c. make
    slice1 := make([]int, 5, 10)
    len(slice1) = 5, cap(slice1) = 10, 元素的初始值为0
  2.2 相关函数
    len
(slice): 返回 slice 的元素个数(长度)
    cap(slice): 返回 slice 的分配空间大小
    append(slice1, slice2...): 把 slice2 追加到 slice1 产生新的 slice, 若 slice2 是变量时,不能省略...,相当于 append(slice1, a[, b, ...])
    copy(目标slice, 源slice): 以最小的切片元素个数为准,将源 slice 复制到 目标 slice
  2.3 cap - len = 0 时,系统将动态分配新的数组空间,即切片会自动处理存储空间不足的问题
  2.4 遍历与 array 一样
  2.5 在传递参数时,传递的为指针

时间: 2024-12-16 17:08:22

【转】 golang slice array的相关文章

golang之array

golang使用array表示固定大小的数组,使用slice表示动态数组. package main import "fmt" func main() { var a = [5]int{2,3,5,7,11} fmt.Printf("type of array: %T\n", a) fmt.Printf("address of array: %p\n", &a) fmt.Printf("address of arrar[0]:

golang slice性能分析

golang在gc这块的做得比较弱,频繁地申请和释放内存会消耗很多的资源.另外slice使用数组实现,有一个容量和长度的问题,当slice的容量用完再继续添加元素时需要扩容,而这个扩容会把申请新的空间,把老的内容复制到新的空间,这是一个非常耗时的操作.有两种方式可以减少这个问题带来的性能开销: 在slice初始化的时候设置capacity(但更多的时候我们可能并不知道capacity的大小) 复用slice 下面就针对这两个优化设计了如下的benchmark,代码在: https://githu

Golang Slice 总结

数组 Go的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要要理解数组.数组类型由指定和长度和元素类型定义.数组不需要显式的初始化:数组元素会自动初始化为零值:Go的数组是值语义.一个数组变量表示整个数组,它不是指向第一个元素的指针(比如C语言的数组).当一个数组变量被赋值或者被传递的时候,实际上会复制整个数组.(为了避免复制数组,你可以传递一个指向数组的指针,但是数组指针并不是数组.)可以将数组看作一个特殊的struct,结构的字段名对应数组的索引,同时成员的数目固定. 切片 数组虽然

golang中Array与Slice

在golang中有数组和Slice两种数据结构,Slice是基于数组的实现,是长度动态不固定的数据结构,本质上是一个对数组字序列的引用,提供了对数组的轻量级访问.那么在go的函数中以数组或Slice为形参的时候就存在一些差别. ? 首先,golang中是值传递,并且如果传递的参数是数组的时候并不会隐式将数组作为引用或者指针传入,而是传入副本,而如果想轻量级传递数据,这个时候就需要使用slice了. 可以通过一个简单的例子来验证这个机制: package main import "fmt"

golang slice

golang 在for range一个slice时,会读出其cap长度.在for的过程中,即使动态append该slice,最终for也会在第一次读取的cap长度处停止. package main import ( "fmt" ) func main() { s := make([]string, 3) s[0]="a" s[1]="b" s[2]="c" for _,i := range s { s = append(s,

Array.prototype.slice && Array.prototype.splice 用法阐述

目的 对于这两个数组操作接口,由于不理解, 往往被误用, 或者不知道如何使用.本文尝试给出容易理解的阐述. 数组 什么是数组? 数组是一个基本的数据结构, 是一个在内存中依照线性方式组织元素的方式, 其中元素的类型必须是相同的, 这个每个元素的索引地址才能被计算出来, 索引通常是数字,用来计算元素之间存储位置的偏移量. 结构如下: javascript数组 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob

slice,Array.prototype.slice,Array.protyotype.slice.call

slice 特点:基于当前数组中的一或多个项创建一个新数组.[原数组不会被修改] 返回结果:返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象. 语法: arr.slice(); arr.slice(start); arr.slice(start,end); 参数解释: start: 1.从该索引开始获取原数组的元素-------从0开始 2.为负数:表示从原数组中倒数第几个元素开始.例子:slice(-2)----->表示提取原数组中的倒数第二个元素到最后一个元素 3.

golang slice去重

golang内没有类似python中集合的数据结构,所以去重这样的运算只能自己造轮子了. 随手写了两个示例,一个是string类型的,一个是int类型的 package main import "fmt" func main() { s1 := []string{"111", "aaa", "bbb", "ccc", "aaa", "ddd", "ccc&q

Golang Slice切片

1. 切片的定义和初始化 切片是基于数组类型的封装,非常灵活,可以自动扩容 切片是真正意义上的动态数组,而且是一个引用类型,切片指向一个底层数组 定义切片 var 切片名[] 切片类型 创建切片方式 package main import "fmt" func main() { // 1. 声明切片 var s1 []int if s1 == nil { // 只声明没有初始化,所以是nil fmt.Println("为空") } else { fmt.Printl