使用条件语句(if)发布范围

时间:2016-01-06 12:47:32

标签: go

我是Go的新手,我正在努力寻找范围(others)。

以下代码生成:

./excel.go:24: err declared and not used
./excel.go:25: sheet declared and not used

为什么会这样?我在父作用域中声明了errsheet,不是吗?

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")
    }
}

2 个答案:

答案 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允许在嵌套块中重新声明具有相同名称的变量。 :=声明一个新变量。在您的情况下,errsheet都在else块中声明,但不在那里使用。