我有 3 个结构:Queue、Config、Tasker
type Queue struct {
Name string
Concurrent int
Connections []*redis.Client
}
type Config struct {
Queues []Queue
RedisAddr string
RedisDB int
}
type Tasker struct {
Config Config
}
问题发生在这个方法中,我在 for 循环中初始化了 queue.Connections,但是我在 for 循环之外得到了零长度的 queue.Connections
func (t *Tasker) StartListening() {
for j := 0; j < len(t.Config.Queues); j++ {
queue := t.Config.Queues[j]
queue.Connections = make([]*redis.Client, queue.Concurrent)
fmt.Println(len(queue.Connections)) //here print correct length, 1 for default queue, 2 for mail queue
}
fmt.Println(len(t.Config.Queues[0].Connections)) //but why here print 0?
}
这是我的测试代码
func main() {
config := Config{
RedisAddr: "10.1.1.59:6379",
RedisDB: 8,
Queues: []Queue{
Queue{Name: "default", Concurrent: 1},
Queue{Name: "mail", Concurrent: 2},
},
}
daemon := Tasker{Config: config}
daemon.StartListening()
}
为什么 fmt.Println(len(t.Config.Queues[0].Connections))
在 for 循环外为 0?
最佳答案
您正在创建一个新的 Queue
而不是访问 Config
结构中的那个,这个新值防止修改 Queue
配置队列
。尝试直接赋值:
// ...
t.Config.Queues[j].Connections = make([]*redis.Client, queue.Concurrent)
// ...
或者,如果您想使用辅助变量,请将 Config.Queues
类型更改为 []*Queue
:
type Config struct {
Queues []*Queue
RedisAddr string
RedisDB int
}
// ...
config := Config{
RedisAddr: "10.1.1.59:6379",
RedisDB: 8,
Queues: []*Queue{
&Queue{Name: "default", Concurrent: 1},
&Queue{Name: "mail", Concurrent: 2},
},
}
现在您的原始代码应该可以工作了。
关于for-loop - golang 初始化后得到空 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44586280/