请问为什么我这里定义err的时候会报错
```go
func(p *Page) load(title string){
p.Title = title
p.Body, err := ioutil.ReadFile(title)
if err != nil {
fmt.Println("load file err:", err)
}
}
```
![image.png](https://static.studygolang.com/201029/a671edc4eeb6d3ca507187dd37b6e2e8.png)
![image.png](https://static.studygolang.com/201029/235fdce02c4ec8417387dbf3f1e85610.png)
7楼 <a href="/user/shadow150519" title="@shadow150519">@shadow150519</a>
```
package main
import(
"fmt"
)
func Assign() (a int, b string) {
return 100, "bbb"
}
func main(){
var arr [5]int
fmt.Println(arr)
arr[1],newb:= Assign()
}
```
a[1] 这种也不行
#8
更多评论
#### 为什么涉及结构体,简短变量声明的规则会报错
根据《Go语言圣经》里面的 2.3.1. 简短变量声明一节提到
http://books.studygolang.com/gopl-zh/ch2/ch2-03.html
```
这里有一个比较微妙的地方:简短变量声明左边的变量可能并不是全部都是刚刚声明的。如果有一些已经在相同的词法域声明过了(§2.7),那么简短变量声明语句对这些已经声明过的变量就只有赋值行为了。
```
按照这个理论的话,就出现了楼主的疑问
不过楼主的代码不完整,我补充了一个更简单完整点的
```golang
package main
import "fmt"
type Page struct {
Title string
Body string
}
func main() {
// 正确的 --- 在这里a是赋值行为,b是声明行为
var a string = "111"
a, b := GetString()
fmt.Printf("a:%s; b:%s\n", a, b) // 输出 a:aaa; b:bbb
// 错误的---??? 为什么同样是简短变量声明,这里会出现问题
// 按照简短变量声明的理论来说,p.Body应该是赋值行为,d是声明行为
/*p := Page{}
p.Body, d := GetString()
fmt.Printf("p.Body:%s; d:%s\n", p.Body, d)*/
}
func GetString() (a string, b string) {
return "aaa", "bbb"
}
```
以上是我看了楼主的问题,个人猜测楼主的疑问是这样来的?不过我也不太清楚原理,只能等待他人补充
#2