2016-01-06 74 views
0

我是Go的新手,我很困惑于范围(如others)。下面使用条件语句(if)进行范围问题

的代码生成:

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

回答

1

使用=代替:=

file, err = xlsx.OpenFile(fileName) // <-- line 24 
    sheet = file.Sheets[0] // <-- line 25 

围棋允许在嵌套块相同的名字重新声明变量。 :=声明一个新变量。在你的情况下,errsheet都是在其他块内部声明的,但不在那里使用。

+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中的可变sheet和28实际上是两个不同的变量(与从未被分配之后使用过的行25中声明的第一个)。

+0

感谢您的链接,我误解了'='和':='原则。 –