关于大数据:大数据开发Go数组切片

50次阅读

共计 2002 个字符,预计需要花费 6 分钟才能阅读完成。

new()和 make 的区别

二者看起来没什么区别,然而他们的行为不同,别离实用于不同的类型

  • new (T) 为每个新的类型 T 调配一片内存,初始化为 0 并且返回类型为 * T 的内存地址:这种办法 返回一个指向类型为 T,值为 0 的地址的指针,它实用于值类型如数组和构造体;它相当于 &T{}。
  • make(T) 返回一个类型为 T 的初始值,它只实用于 3 种内建的援用类型:切片、map 和 channel

bytes 包

类型 []byte 的切片非常常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法,比方 bytes 的 buffer,就提供 Read 和 Write 的办法,读写未知长度的 bytes 时候最好用 buffer,上面的例子相似于 Java 的 StringBuilder 的 append 办法

var buffer bytes.Buffer
for {if s, ok := getNextString(); ok {//method getNextString() not shown here
        buffer.WriteString(s)
    } else {break}
}
fmt.Print(buffer.String(), "\n")

slice 重组

晓得切片创立的时候通常比相干数组小,例如:

slice1 := make([]type, start_length, capacity)

其中 start_length 作为切片初始长度而 capacity 作为相干数组的长度。

这么做的益处是咱们的切片在达到容量下限后能够扩容。扭转切片长度的过程称之为切片重组 reslicing,做法如下:slice1 = slice1[0:end],其中 end 是新的开端索引(即长度), 如果想减少切片的容量,咱们必须创立一个新的更大的切片并把原分片的内容都拷贝过去

package main
import "fmt"

func main() {sl_from := []int{1, 2, 3}
    sl_to := make([]int, 10)

    n := copy(sl_to, sl_from)
    fmt.Println(sl_to)
    fmt.Printf("Copied %d elements\n", n) // n == 3

    sl3 := []int{1, 2, 3}
    sl3 = append(sl3, 4, 5, 6)
    fmt.Println(sl3)
}

留神:append 在大多数状况下很好用,然而如果你想齐全掌控整个追加过程,你能够实现一个这样的 AppendByte 办法:

func AppendByte(slice []byte, data ...byte) []byte {m := len(slice)
    n := m + len(data)
    if n > cap(slice) { // if necessary, reallocate
        // allocate double what's needed, for future growth.
        newSlice := make([]byte, (n+1)*2)
        copy(newSlice, slice)
        slice = newSlice
    }
    slice = slice[0:n]
    copy(slice[m:n], data)
    return slice
}

Slice 的相干利用

假如 s 是一个字符串(实质上是一个字节数组),那么就能够间接通过 c := []byte(s) 来获取一个字节的切片 c。另外还能够通过 copy 函数来达到雷同的目标:copy(dst []byte, src string),应用 substr := str[start:end] 能够从字符串 str 获取到从索引 start 开始到 end-1 地位的子字符串

package main

import "fmt"

func main() {
    s := "\u00ff\u754c"
    for i, c := range s {fmt.Printf("%d:%c", i, c)
    }
}

在内存中,一个字符串实际上是一个双字构造,即一个指向理论数据的指针和记录字符串长度的整数(见图 7.4)。因为指针对用户来说是齐全不可见,因而咱们能够仍旧把字符串看做是一个值类型,也就是一个字符数组。

字符串 string s = “hello” 和子字符串 t = s[2:3]

  • 批改字符串

    • Go 语言中的字符串是不可变的,也就是说 str[index] 这样的表达式是不能够被放在等号左侧的,如果必须要批改,必须要先将字符串转为字节数组,而后通过批改元素值来达到批改字符串的目标,最初要讲字节数组转回字符串格局
  • 字符串比照函数

    • Compare 函数会返回两个字节数组字典程序的整数比照后果
  • 搜寻及排序切片和数组

    • 规范库提供了 sort 包来实现常见的搜寻和排序操作。您能够应用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序
  • 切片和垃圾回收

    切片的底层指向一个数组,该数组的理论容量可能要大于切片所定义的容量。只有在没有任何切片指向的时候,底层的数组内存才会被开释,这种个性有时会导致程序占用多余的内存
    吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。
    更多请关注

正文完
 0