Go 运行时错误:“分配给 nil map 中的条目”



我是golang的新手。我正在尝试读取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>
    `)
}

我的代码出了什么问题?

我不知道

你想得到什么,但错误告诉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
    }
}

最新更新