Golang的append()什么时候创建一个新的切片?
append()的文档表明它会分配一个新的切片并且当原切片容量不足时,进行元素复制。但是,在检查以下代码的输出时会出现差异,该代码会生成布尔字母表的组合。
<code class="go">package main import ( "fmt" ) func AddOption(c chan []bool, combo []bool, length int) { if length == 0 { fmt.Println(combo, "!") c <p><strong>对比观察</strong></p> <p>在输出中,以感叹号结尾的行表示 AddOption 通过通道发送的切片,而没有感叹号的行表示 main() 中接收的切片。值得注意的是,尽管append()据称返回了一个新切片,但通过通道发送的切片似乎在发送后被修改。</p> <p><strong>检查源</strong></p> <p>有问题的代码块是:</p> <pre class="brush:php;toolbar:false"><code class="go">var newCombo []bool for _, ch := range []bool{true, false} { newCombo = append(combo, ch) AddOption(c, newCombo, length-1) }</code>
根据文档,当原始切片的容量不足时,append() 应该返回一个新的切片描述符,指向新的底层数据数组。但是,作为 AddOption 的第二个参数传递的值可以是指向切片描述符的指针,也可以是切片描述符的真实副本。
澄清行为
这个问题的答案在于区分切片数据类型和它的实际表示。切片描述符由长度和容量的两个整数以及指向底层数据的指针组成。
虽然append()确实返回一个带有可能不同的底层数据数组的新切片描述符,但指向数据的指针除非容量扩大,否则保持不变。这意味着虽然切片描述符本身是副本,但指针值(底层数据的地址)是共享的。
其他示例
为了说明,请考虑这个代码片段:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) s = append(s, []int{1, 2, 3, 4}...) a := append(s, 5) fmt.Println(a) b := append(s, 6) fmt.Println(b) fmt.Println(a) }</code>
此代码打印:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
最初,s有足够的容量,因此a和b共享相同的底层数据指针。但是,如果我们将 s 的容量减少到 4,输出将更改为:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
这表明只有当 s 有足够的容量时,a 和 b 才会共享相同的底层数据。
以上是为什么 Golang 的 `append()` 似乎在通过通道发送切片后修改它?的详细内容。更多信息请关注PHP中文网其他相关文章!

goroutinesarefunctionsormethodsthatruncurranceingo,启用效率和灯威量。1)shememanagedbodo'sruntimemultimusingmultiplexing,允许千sstorunonfewerosthreads.2)goroutinessimproverentimensImproutinesImproutinesImproveranceThroutinesImproveranceThrountinesimproveranceThroundinesImproveranceThroughEasySytaskParallowalizationAndeff

purposeoftheInitfunctionoIsistoInitializeVariables,setUpConfigurations,orperformneccesSetarySetupBeforEtheMainFunctionExeCutes.useInitby.UseInitby:1)placingitinyourcodetorunautoamenationally oneraty oneraty oneraty on inity in ofideShortAndAndAndAndForemain,2)keepitiTshortAntAndFocusedonSimImimpletasks,3)

Gointerfacesaremethodsignaturesetsthattypesmustimplement,enablingpolymorphismwithoutinheritanceforcleaner,modularcode.Theyareimplicitlysatisfied,usefulforflexibleAPIsanddecoupling,butrequirecarefulusetoavoidruntimeerrorsandmaintaintypesafety.

在Go中使用recover()函数可以从panic中恢复。具体方法是:1)在defer函数中使用recover()捕获panic,避免程序崩溃;2)记录详细的错误信息以便调试;3)根据具体情况决定是否恢复程序执行;4)谨慎使用,以免影响性能。

本文讨论了使用GO的“字符串”软件包进行字符串操作,详细介绍了共同的功能和最佳实践,以提高效率并有效地处理Unicode。

本文详细介绍了GO的“时间”包用于处理日期,时间和时区,包括获得当前时间,创建特定时间,解析字符串以及测量经过的时间。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3汉化版
中文版,非常好用

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境