我最近学习了Go语言,现在对以下代码感到困惑:
package main
import "fmt"
func main() {
a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
结果:
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 0]
c是从数组中获取的一个切片b。这不是副本,而只是的两个前两个元素的窗口b。
由于b容量为5,c可以扩展到其他3个位置(实际上,它会创建一个新的切片,但位于内存中的同一位置)。
切片的最大容量是底层数组的容量减去切片在数组中起始位置的大小:
array : [0 0 0 0 0 0 0 0 0 0 0 0]
array : <---- capacity --->
slice : [0 0 0 0]
slice : <---- capacity --->
```
也许此程序将使c和d仅仅是b上的窗口:
func main() {
b := make([]int, 0, 5)
c := b[:2]
d := c[1:5] // this is equivalent to d := b[1:5]
d[0] = 1
printSlice(“c”, c)
printSlice(“d”, d)
}
输出:
c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0]
```
问题内容: 根据内置的api docs,当原始切片的容量不够大时,append()将重新分配并复制到新的数组块。 这是递归算法(的简化版本),用于创建字母(在这种情况下为布尔值)的组合。字母表中的成员(真,假)将递归地添加到切片中,直到其长度正确为止,然后通过通道将其发送出去。 这是此代码的操场链接。在输出中: 以感叹号结尾的行是从AddOption发送到通道的行。那些没有的东西则出现在另一端(即
问题内容: 为了制作半随机的子弹,我想使用uuid的前8个字符。所以我有 但是在编译时我得到这个错误: 无法将u1(类型为uuid.UUID)转换为类型[] rune 我该如何解决? 问题答案: 在该程序包中(我只是看过源代码),UUID是的别名,因此您无法将其协调为符文数组,而不是您想要的。 试试这个: 这将为您提供8个十六进制数字。但是,这仍然是一种回旋处事方式。v4 UUID除某些位外都是随
问题内容: 我进行了以下测试,即打印原始输入切片(过滤后),而没有删除元素,但是最后有一个额外的元素,使输入切片具有相同的长度,即使过滤后应该较短。 我已经看过这篇文档https://github.com/golang/go/wiki/SliceTricks#delete 但是我认为我缺少有关Go的一些技巧,因为似乎我使用的切片方法错误。 如何避免出现“输出片段”?(以正确的方式打印,包含正确的元
我正在使用这个命令从切片中删除一个元素,但它不起作用,请建议。
我试图在CSS/HTML和JavaScript中重新创建这种切换。当关闭时,切换显示标题:“Stap 2 Implementatie in de Organizatie”和一个图标(圆圈中有加号)。当打开时,它会显示一些文本,下面是一个带有可下载工具的部分,它们可以被实现为相邻的图像,但如果图标和文本分开,它可能更多用途。 我已经设法创建了标题,它下面的文本,我只是需要帮助: 关闭切换和打开切换的
问题内容: 我在正在研究的项目中遇到问题。我找到了解决方法,但是我不确定为什么我的解决方案有效。我希望对Go指针的工作方式有更多经验的人能对我有所帮助。 我有一个Model接口和一个实现该接口的Region结构。Model接口是在Region结构的指针上实现的。我也有一个Regions集合,它是Region对象的一部分。我有一种方法可以将Regions对象转换为[] Model: 当我运行此代码时