golang panic: nil map
при работе получается ввести 1 значение для Twice, а дальше пишет: panic: assignment to entry in nil map Буду признателен, если кто объяснит из-за чего это.
//изучаю ЯП и вообще я новичок в этих делах.
package main
type Once struct {
name string
somthingInt int
}
type newText string
type Twice struct {
tempMap map[newText]*Once
}
func (v Twice) Put(stud Once) (tmpU Twice, err error) {
found := true
NameForKeyStruct := newText(thisOnce.name)
_, found = v.tempMap[NameForKeyStruct]
if !found {
v.tempMap[NameForKeyStruct] = &thisOnce
} else {
return tmpU, err
}
return tmpU, nil
}
func main() {
var tmpU Twice
TmpU.tempMap = map[studentName]*thisOnce
var thisOnce Once
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("enter Once details")
for {
tmp := scanner.Text()
slice := strings.SplitN(tmp, " ", -1)
if len(slice) == 3 {
var err error
thisOnce.name = (slice[0])
thisOnce.somthingInt, err = strconv.Atoi(slice[1])
if err != nil {
fmt.Printf("%#v\n", err)
}
fmt.Println("data base append")
fmt.Println("wait to input...")
TmpU, err = (&TmpU).Put(*&thisIsOnce)
if err != nil {
fmt.Printf("%#v\nNot try old name!", err)
}
slice = nil
} else {
fmt.Println("Not full information")
fmt.Println("wait to input...")
}
if scanner.Scan() == false {
break
}
}
fmt.Printf("значения Twice:%v", tmpU)
}
// Удалил вопрос о "return _, err"
Ответы (2 шт):
строки вида var1, var2 := myFunction() работают следующим образом, что первый результат функции присваивается на var1, второй на var2.
в языке есть строгие ограничения, что все переменные должны быть использованы.
Тогда прибегаем к стилю
_, var2 := myFunction()
var1, _ := myFunction()
_, _:= myFunction()
что означает
- я заинтересован только в значении var2, а про var1 можно забыть
- я заинтересован только в значении var1, а про var2 можно забыть
- мне не нужны результаты функции. указывается, чтобы явно об этом говорить читающему код
так как _ не обладает никаким значением и не является переменным, то вы не сможете его возвращать как результат функции return _, err
если функция требует возвращение какого либо значения, то в случае ошибки верните nil или значение по умолчанию
func f1() (string, error) {
return "", fmt.Errorf("error")
}
func f2() (*string, error) {
return nil, fmt.Errorf("error")
}
требовалось в func main() добавить make в строку "TmpU.tempMap = map[studentName]*thisOnce"
пример: TmpU.tempMap = make(map[studentName]*thisOnce)
и после начало принимать больше 1 значения для этой map и больше не вызывать panic
спасибо за подсказку насчёт return nil