当前位置: 首页 > 面试题库 >

Go中成语的切片拼接吗?

司寇烨伟
2023-03-14
问题内容

我有以下用于实现拼接的代码(即,给定一个字节片已满,另一个字节片部,以及一个表示要用部分覆盖的完整位置的int pos):

package main

import (
    "fmt"
    "bytes"
)

func main() {
    full := []byte{0,0,0,0,0,0,0}
    part := []byte{1,1,1}

    newFull1 := splice(full, part, 2)
    fmt.Println(newFull1)
    // [0 0 1 1 1 0 0]

    newFull2 := splice(full, part, 3)
    fmt.Println(newFull2)
    // [0 0 0 1 1 1 0]
}

func splice(full []byte, part []byte, pos int) []byte {
    return bytes.Join([][]byte{full[:pos], part, full[len(full[:pos])+len(part):]}, []byte{})
}

基本上,我的方法执行3个字节片的连接:不完整的第一部分不被部分,全部部分覆盖,然后覆盖剩余的完整部分。有没有更好/更惯用的方法?我无法在标准库中找到实现此目的的方法。


问题答案:

如果您知道部分完全在全部范围之内,则可以使用复制功能。

func main() {
    full := []byte{0, 0, 0, 0, 0, 0, 0}
    part := []byte{1, 1, 1}

    copy(full[2:], part)
    fmt.Println(full)
}

操场

但是,这将完全覆盖。如果要保留原件,可以先使用append函数进行复制。

func main() {
    full := []byte{0, 0, 0, 0, 0, 0, 0}
    part := []byte{1, 1, 1}

    newFull := append([]byte{}, full...)
    copy(newFull[2:], part)
    fmt.Println("newFull:      ", newFull)
    fmt.Println("original full:", full)
}

操场

请注意,这仍然具有原始代码的局限性,即该部分必须适合full的范围。



 类似资料:
  • 本位主要介绍一下 Go 语言中可变长度的"数组"——切片(slice)。数组有数组的用处,但是其不可变长度的特性,注定了在大多场景下不是很受欢迎。在大多数场景下我们都会选择更加灵活的切片。 1. 切片的创建 切片的声明方式和数组类似,写法上看就是声明一个没有长度的数组:var 切片名 []切片类型。其中切片类型可以是切片本身,也就是切片的切片,就构成了多维的切片。 切片在使用之前必须要初始化,它没

  • 主要内容:从数组或切片生成新的切片,直接声明新的切片,使用 make() 函数构造切片切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/ C++ 中的数组类型,或者 Python 中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。 Go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“

  • 问题内容: 我是Go编程的新手。我已经阅读了Go编程书籍,其中的内容由三部分组成:指向数组的指针,长度和容量。 我对nil slices(切片没有指向len的下层数组,len = 0,cap = 0),非lens切片(其中只有len = 0,cap = 0)和空切片之间感到困惑。 谁能告诉我nil和空片是否相同?如果两者都不相同,那么请说出两者之间的区别是什么? 如何测试切片是否为空? 另外,指针

  • 我是一个编程新手。我在go编程书中读到过,片由三部分组成:指向数组的指针、长度和容量。 我感到困惑的零切片(切片没有底层数组指向,len=0,cap=0),非零切片只有len=0,cap=0和空切片。 谁能告诉我零和空切片是否是一回事?如果它们都不同,那么请告诉这两者之间的区别是什么? 如何测试一个切片是否为空? 另外,指针在长度和容量为零的非nil片中保留什么值?

  • Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 定义切片 你可以声明一个未指定大小的数组来定义切片: var identifier []type 切片不需要说明长度。 或使用make()函数来创建切片: var s

  • Go语言中同样允许使用多维切片,声明一个多维数组的语法格式如下: var sliceName [][]...[]sliceType 其中,sliceName 为切片的名字,sliceType为切片的类型,每个 代表着一个维度,切片有几个维度就需要几个 。 下面以二维切片为例,声明一个二维切片并赋值,代码如下所示。 上面的代码也可以简写为下面的样子。 上面的代码中展示了一个包含两个元素的外层切片,同