2016-01-06 121 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

感謝您的鏈接,我誤解了'='和':='原則。 –