Go &引用;声明但未使用;变量输入为';s条件表达式

Go &引用;声明但未使用;变量输入为';s条件表达式,go,Go,我的直觉方法: 但它不起作用 您可以分享一些替代方法吗?您正在声明一个不使用的变量(moreline)。这里有两个选项:用下划线替换moreline,这意味着可以忽略返回值 for moreline { line, _, err := bio.ReadLine() if err != nil { log.Fatal(err) } fmt.Println(line) } 但更好的选择是使用ReadS

我的直觉方法:

但它不起作用


您可以分享一些替代方法吗?

您正在声明一个不使用的变量(
moreline
)。这里有两个选项:用下划线替换
moreline
,这意味着可以忽略返回值

for moreline {
        line, _, err := bio.ReadLine()
        if err != nil {
                log.Fatal(err)
        }
        fmt.Println(line)
}
但更好的选择是使用
ReadScanner
ReadBytes('\n')
ReadString('\n')

检查
bufio.go
文件这是对
ReadLine
方法的描述:

ReadLine是一种低级的行读取原语。大多数来电者应该 请改用ReadBytes(“\n”)或ReadString(“\n”)或使用扫描仪

ReadLine
之后调用
UnreadByte
将始终未读取读取的最后一个字节(可能是属于行尾的字符),即使该字节不是
ReadLine
返回的行的一部分
ReadLine
要么返回一个非零行,要么返回一个错误,两者都不能

因此,这将是一个更好的选择:

scanner := bufio.NewScanner(bio)

for scanner.Scan() {
    line := scanner.Text()
    fmt.Printf("%v\n", line)
}

您可以使用
:=
,它会丢弃变量之前的内容。在该范围内不使用
morelines
,因此会显示错误消息

如果您事先声明了变量,并且没有使用
:=
,那么它可以正常工作。函数
ReadLine()
可能不会执行您认为应该执行的操作

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    bio := bufio.NewReader(os.Stdin)
    var line []byte
    var err error
    moreline := true
    for moreline {
        line, moreline, err = bio.ReadLine()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(line)
    }
}

如果不需要变量,请使用下划线复制。有一个很好的解释为什么go语言创建者添加了这个检查。