0

Does anyone have any idea why this doesn't work?

I've been racking my brain for about 4 hours now. I cannot make it work.

In my opinion, I'm trying to do the same thing twice. I'm making a map of a field in a struct, and then I'm doing it again on another field in a different struct.

If I try to make the map. It fails with: "cannot assign to struct field. Bet.Events["one"].Runners in map".

So if I remove the make, and just try to assign it, I get: "assignment to entry in nil map"

https://play.golang.org/p/kRcXoyO-8FN

var Bet BetStruct

type BetStruct struct {
    Events     map[string]Event
}

type Event struct {
    Name       string
    Runners    map[int]Runner
}

type Runner struct {
    Name       string
}

func main(){

    // == THIS WORKS FINE ==
    Bet.Events = make(map[string]Event)

    Bet.Events["one"] = Event{
        Name: "first",
    }
    Bet.Events["two"] = Event{
        Name: "second",
    }

    // == THIS DOES NOT WORK ==
    Bet.Events["one"].Runners = make(map[int]Runner)

    Bet.Events["one"].Runners[0] = Runner{
         Name:  "Jeff",
    }
}
user1894292
  • 829
  • 1
  • 8
  • 19
  • 2
    Values stored in a map are not addressable, you can't change them. You can only reassign them. – icza Oct 01 '18 at 22:58
  • Both hash / associative arrays has realize only three operations: add key-value, delete key-value and get key-value. It hasn't reassign operation. Such concept. – Alexander Anufriev Oct 02 '18 at 11:04

1 Answers1

2

The default value for map is nil (before or without make(map))

You set a default value for Runners in this code:

Bet.Events["one"] = Event{
    Name: "first",
}

So, Runners wasn't defined clearly and was setting to nil.

Structs are mutable except map elements. (From below comment of @icza: "Structs are modifiable. It's values stored in map that are not modifiable, because values stored in a map are not addressable.")
You cannot reinitialize map element Bet.Events["one"] because is not addressable.

You need to do:

Bet.Events["one"] = Event{
    Name: "first",
    Runners: make(map[int]Runner),
}

Thanks @icza for marking errors in the text

Community
  • 1
  • 1
  • 1
    Thank you so much for the answer and especially the explanation. I feel like I understand it a lot more now. Didn't realise structs were immutable. – user1894292 Oct 01 '18 at 22:58
  • 1
    _"The default value for struct is `nil`."_ Wrong. `nil` is not even a valid value for struts. – icza Oct 01 '18 at 22:59
  • 1
    _"Structs are not modifiable thing"_ Wrong. Structs are modifiable. It's values stored in map that are not modifiable, because values stored in a map are not addressable. – icza Oct 01 '18 at 23:00
  • icza thanks a lot. You a right! – Alexander Anufriev Oct 01 '18 at 23:03