go - 为什么我的 go 函数参数在调用函数之前和函数内部的大小不同?
问题描述
作为测试 Golang 的一部分,我最终遇到了障碍,所以我是新手。
我编写了一个快速玩具程序来搜索字符串列表中的模式,我想同时进行。
我编写了一个search(data *[]string, input_string *string, channel chan<- []string)
函数,使用一个通道将过滤后data
的结果发回。
但是,data
在我将它传递给函数之前似乎有不同的大小,并且在函数内部: inside search
,它的大小非常小,而且不正确。
完整的代码在那里:https ://gitlab.com/jiehong/kata_test_language/-/blob/master/wiki.go#L39 ,所以你可以测试它。
基本上,我启动了一个 goroutine 列表,并一个接一个地从他们自己的频道中检索它们的结果:
var channels [](chan []string)
for _, chunk := range chunks {
channel := make(chan []string, 1)
channels = append(channels, channel)
go search(&chunk, &input_string, channel)
}
var filtered_data []string
for _, channel := range channels {
part_filtered := <-channel
filtered_data = append(filtered_data, part_filtered...)
}
但是chunk
,虽然在循环内有效,但在search
处理它时似乎是空的。
我在这里做错了什么?
解决方案
问题是search
需要一个*[]string
. 更改它以[]string
修复它。
这被沃尔克表示为“也”,但这是修复。
正如 hmm 所指出的,这可能与https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables相关联。
不过, Runninggo vet wiki.go
并没有就这个问题发出警告。
推荐阅读
- java - Gradle 文件定位问题
- angular - 如何
通过 Visual Studio Publish 为 Angular 项目定义? - vb.net - ml.net 0.11 试图预测数组/数字序列 - 标签列“”的模式不匹配:预期 R4,得到向量
参数名称:labelCol' - ios - 不确定我是否应该使用实时数据库
- python - 如何检查值是否与python中的类型匹配?
- flutter - 如何在 Flutter 应用中保存登录名和用户信息
- vue.js - 带有子菜单的 Vuetify 导航抽屉
- mysql - MySQL如何在tsv文件中导入不同的字符集
- python - 与 PYod 的真正异常值有多大区别?
- php - Laravel 验证:只允许已知的属性/属性,否则验证失败