【问题标题】:Why is the go compiler flagging my variable as unused?为什么 go 编译器将我的变量标记为未使用?
【发布时间】:2025-12-31 11:30:10
【问题描述】:

我在 * 上的第一个问题 :D

我正在运行 go 1.16。我创建了这个函数:

func (_m *MyPool) InChannel(outs ...chan interface{}) error {
    for _, out := range outs {
        out = _m.inChan
    }
    return nil
}

MyPool 是一种工作池类型,其中包含以下成员:

type MyPool struct {
    inChan          chan interface{}
}

我的主要问题是,当遍历 InChannel 的可变参数输入时,Go 标记了 out 循环变量。这是为什么?我确实在使用它...

抱歉,我是 * 的菜鸟,所以我正在编辑以澄清一下。我确实想分配,而不是发送。这是因为发送者将有一个outChan chan interface{} 作为成员变量,并将通过以下方式发送值:

func (s *Sender) Out(out interface{}) {
    select {
    case <-s.Ctx.Done():
        return
    case s.outChan <- out:
        return
    }
}

编辑:所以我最终通过这样做来解决它:

func (m *MyPool) InChannel(outs ...*chan interface{}) error {
    for _, out := range outs {
        *out = m.inChan
    }
    return nil
}

【问题讨论】:

  • out &lt;- _m.inChan 不是您真正想要做的吗?或者_m.inChan &lt;- out?或者您希望通过out = _m.inChan 实现什么?
  • 另外,虽然它在任何意义上都没有错误,但接收者变量的名称_m 不是很好的 Go 风格:m 会很好。跨度>

标签: go concurrency


【解决方案1】:

您并没有“真正”使用它。您将某些内容分配给您未读取的变量,因此分配无效,因此基本上您没有使用该变量。

请注意,=assignment。如果您想在频道上发送内容,请使用send 声明:

out <- _m.inChan

或者您想更改out 代表的值? out 是一个循环变量,它是您所覆盖的切片元素的副本。给out赋值只会给循环变量赋值,不会给切片元素赋值。

通常,您可以通过使用index expression 分配一个值来更改切片元素,如下所示:

s := []int{1, 2, 3}
for i := range s {
    s[i] = 10 // Assign a value to the slice elements
}

但是,在您的情况下,这不会有任何好处,因为您的范围是可变参数的切片。

【讨论】:

  • 非常有趣,我认为这是由于可变参数输入?如果我不使用可变参数输入,赋值确实会生效,对吗?
  • 这与可变参数无关。您有一个循环变量out,您为其分配了一个值,但您从未读取过该变量。所以它没有用,它被归类为“未使用”。 Go 不允许使用未使用的变量。
  • "赋值确实生效" -- @eloib 不是它没有,out in InChannel 是调用者值的副本,所有你重新做的是分配给副本,调用者的值不会改变。如果您必须做类似的事情,请使用指针间接。
  • 谢谢大家!抱歉,我为 MyPool 类型创建了相同的方法,因为它确实包含 inChan chan interface{},但是该方法是在 MyPool 指针接收器上实现的,因此需要一个 chan 指针是完全有道理的! !
最近更新 更多