我是Go的新手,我正在努力寻找范围(others)。
以下代码生成:
./excel.go:24: err declared and not used
./excel.go:25: sheet declared and not used
为什么会这样?我在父作用域中声明了err
和sheet
,不是吗?
Excel.go:
package main
import (
"os"
"fmt"
"github.com/tealeg/xlsx"
)
func main() {
var file *xlsx.File
var sheet *xlsx.Sheet
var row *xlsx.Row
var cell *xlsx.Cell
var err error
fileName := "MyXLSXFile.xlsx"
if _, err := os.Stat(fileName); os.IsNotExist(err) {
fmt.Printf("File does not exist so create one");
file = xlsx.NewFile()
sheet, err = file.AddSheet("Sheet1")
} else {
fmt.Printf("File exists so open");
file, err := xlsx.OpenFile(fileName) // <-- line 24
sheet := file.Sheets[0] // <-- line 25
}
row = sheet.AddRow()
cell = row.AddCell()
cell.Value = "I am a cell!"
cell = row.AddCell()
cell.Value = "I am another cell!"
err = file.Save(fileName)
if err != nil {
fmt.Printf("help")
}
}
答案 0 :(得分:2)
TL; DR:使用=
进行纯分配。 :=
声明了一个新变量。
sheet := file.Sheets[0]
在else
块的范围内声明一个新变量(参见章节"Short variable declaration" from the language spec)。此变量隐藏在外部作用域中声明的同名变量,并且不会存在于外部作用域中(see the documentation):
在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec的末尾开始(ShortVarDecl用于短变量声明),并在最内层包含块的末尾结束。
因此第25行中的变量sheet
和第12行和第28行中的变量sheet
实际上是两个不同的变量(第25行中声明的第一个变量永远不会出现分配后使用。)
答案 1 :(得分:1)
使用=
代替:=
:
file, err = xlsx.OpenFile(fileName) // <-- line 24
sheet = file.Sheets[0] // <-- line 25
Go允许在嵌套块中重新声明具有相同名称的变量。 :=
声明一个新变量。在您的情况下,err
和sheet
都在else块中声明,但不在那里使用。