我是go lang的新人。我试图读取csv文件并收集数据。
但是在运行之后我收到了这个错误:
panic: assignment to entry in nil map
goroutine 1 [running]:
panic(0x4dedc0, 0xc082002440)
C:/Go/src/runtime/panic.go:464 +0x3f4
main.(*stateInformation).setColumns(0xc08202bd40, 0xc082060000, 0x11, 0x20)
F:/Works/Go/src/examples/state-info/main.go:25 +0xda
main.main()
F:/Works/Go/src/examples/state-info/main.go:69 +0xaea
我的代码:
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
"strconv"
)
type stateInformation struct {
columns map[string]int
}
type state struct {
id int
name string
abbreviation string
censusRegionName string
}
func (info *stateInformation) setColumns(record []string) {
for idx, column := range record {
info.columns[column] = idx
}
}
func (info *stateInformation) parseState(record []string) (*state, error) {
column := info.columns["id"]
id, err := strconv.Atoi(record[column])
if err != nil {
return nil, err
}
name := record[info.columns["name"]]
abbreviation := record[info.columns["abbreviation"]]
censusRegionName := record[info.columns["census_region_name"]]
return &state{
id: id,
name: name,
abbreviation: abbreviation,
censusRegionName: censusRegionName,
}, nil
}
func main() {
// #1 open a file
f, err := os.Open("state_table.csv")
if err != nil {
log.Fatalln(err)
}
defer f.Close()
stateLookup := map[string]*state{}
info := &stateInformation{}
// #2 parse a csv file
csvReader := csv.NewReader(f)
for rowCount := 0; ; rowCount++ {
record, err := csvReader.Read()
if err == io.EOF {
break
} else if err != nil {
log.Fatalln(err)
}
if rowCount == 0 {
info.setColumns(record)
} else {
state, err := info.parseState(record)
if err != nil {
log.Fatalln(err)
}
stateLookup[state.abbreviation] = state
}
}
// state-information AL
if len(os.Args) < 2 {
log.Fatalln("expected state abbreviation")
}
abbreviation := os.Args[1]
state, ok := stateLookup[abbreviation]
if !ok {
log.Fatalln("invalid state abbreviation")
}
fmt.Println(`
<html>
<head></head>
<body>
<table>
<tr>
<th>Abbreviation</th>
<th>Name</th>
</tr>`)
fmt.Println(`
<tr>
<td>` + state.abbreviation + `</td>
<td>` + state.name + `</td>
</tr>
`)
fmt.Println(`
</table>
</body>
</html>
`)
}
我的代码有什么问题?
答案 0 :(得分:3)
我不知道你想要获得什么,但错误告诉我,columns
地图在分配时没有column
索引,因此引起了恐慌
panic: assignment to entry in nil map
要使其工作,您必须在开始填充索引之前初始化地图本身。
state := &stateInformation{
columns: make(map[string]int),
}
或者另一种初始化方式:
func (info *stateInformation) setColumns(record []string) {
info.columns = make(map[string]int)
for idx, column := range record {
info.columns[column] = idx
}
}