如果您在
if语句之前声明一个变量并在
if块中使用它,则条件求值并不重要,这不是编译时错误。
这种情况下的错误是您没有在
if块内使用声明的变量。您的代码:
var pageID stringvar offset intif len(r.URL.Path) > len("/page/") { pageID := r.URL.Path[len("/page/"):] offset, err := strconv.Atoi(pageID) if err != nil { log.Fatal(err) }}在内部,
if您没有分配给先前声明的
pageID,而是使用了简短的变量声明
:=,该声明创建了一个新变量,遮盖了在外部块中创建的变量,并且该变量仅在
if块的末尾有效(其作用域在最里面的包含块的末尾)。
解决方案是(您最可能想要的)简单地使用赋值
=(将值赋给现有变量):
pageID = r.URL.Path[len("/page/"):]为了使其理解,请参见以下示例:
i := 1fmt.Println("Outer:", i){ i := 2 // Short var decl: creates a new i, shadowing the outer fmt.Println("Inner:", i)}fmt.Println("Outer again:", i)输出(在Go Playground上尝试):
Outer: 1Inner: 2Outer again: 1



