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

Println更改切片的容量

甄永年
2023-03-14
问题内容

考虑以下代码

package main

import (
    "fmt"
)

func main() {
    x := []byte("a")
    fmt.Println(x)
    fmt.Println(cap(x) == cap([]byte("a"))) // prints false

    y := []byte("a")
    fmt.Println(cap(y) == cap([]byte("a"))) // prints true

}

https://play.golang.org/p/zv8KQekaxH8

使用slice变量调用简单的Println会更改其容量。我怀疑调用带有可变参数的任何函数都会...interface{}产生相同的效果。对于这种行为是否有任何理智的解释?


问题答案:

解释是,就像github中的 bradfitz point
一样,如果您不使用它来创建切片,则编译器将使用它认为方便的上限。
创建具有不同版本甚至相同版本的多个片可能会导致具有不同容量的片。make

简而言之,如果您需要具体的功能,请使用make([]byte, len, cap)。否则,您将无法信任固定的容量。



 类似资料:
  • 我有一个显示列表的导航抽屉和一个显示内容的视页。当单击导航抽屉上列表中的特定项目时,将为所有页面生成一个URL,该URL将导致视图分页程序内容的更改。导航抽屉和查看页处于相同的活动中。view pager中的片段具有从服务器检索内容的URL。我怎样才能找到它? 下面是一些代码: 查看页有三页。适配器如下: 这些页面都有一个URL字段,用于从包含数据的服务器中提取json。所以简而言之,问题是当导航

  • 问题内容: 我有一个要使用函数更改的切片(例如,我想删除第一个元素)。我以为可以使用指针,但仍然无法为其编制索引。我究竟做错了什么? 游乐场链接: 问题答案: 您需要使用。 或通常更像偶像的另一种方法:

  • 问题内容: 如您所见,在上面的函数中,我将切片的指针传递给该函数。在某一点上将指针推入切片中。之后,在让函数再次递归调用自身之前,我检查matchingDiv切片的内容。然后在if所在的位置下,该函数递归调用一次。然后我停在并再次检查切片的内容。而且内容与以前完全不同。 只有一种,内容如何改变?每次我将其传递到下一个递归调用时,是否使用相同的指针? 问题答案: 该变量在循环开始时声明一次,每次迭代

  • 得出的结果是: [0 0] [0 0 6 6 6] [0 0] [0 0 6 6 6 0 0 0 0 0] 请问一下,第三个结果为什么是[0 0],而不是 [0 0 6 6 6] 呢, 在Test2 函数中,使用append的时候,并没有扩容,添加的数据还在底层数组的容量中, 那为啥在 Test2函数之后 s3是[0 0] 即使是在原有的容量基础上扩容,那为啥 s4:=s3[0:10] 是[0 0

  • 问题内容: 我很好奇拆包切片并将其作为参数发送给可变参数函数。 假设我们有一个带有可变参数的函数: 如果我们不想传入一个接口,它就可以工作,那么我们是否拆包都没关系: 如果我们有一片片的话,那会很棘手。在这里,编译器不允许我们传递解压版本: 错误提示: 在解包参数中不能将sliceOfSlices(类型[] [] interface {})用作类型[] interface {} 我不知道为什么会这

  • 问题内容: 我在做下面的运动。 创建一个包含四个元素的切片。 创建一个新切片,并将第三个和第四个元素仅复制到其中。 我已经返回了以下程序 我程序的输出是。但我希望newElements切片为[3 4]- 我的程序出了什么问题。 问题答案: 使用内置的复制功能将元素从一个切片复制到另一个切片。 在操场上跑 您可以使用append创建切片并在单个语句中复制元素,但是代码并不像使用copy那样明显。 在