Search code examples
dictionarygounique

Can you have a map with no value in go?


I ask since I like that maps do not allow multiple keys. I know you can do something like the below where your values are bools or empty struct, but is there a way to get around specifying any value for your keys? Is there some advantage to having to specify an empty struct?

Related question, but focused on appending only unique values.

type N struct {}

func tengoQueCagar() {
    var map_almost_empty_value1 = map[int]bool{0:true,1:false}
    var map_almost_empty_value2 = map[int]struct{}{0:struct{}{},1:struct{}{}} //long and seems like lame syntax...
    var map_almost_empty_value3 = map[int]N{0:N{},1:N{}} //shorter.. better?

    var map_not_possible_empty_value_2 = map[int]nil{0:nil,1:nil} // better than empty struct syntax... but not possible
    var map_not_possible_empty_value_2 = map[int]{0,1} // ideally possible... but not... 

    //do something...
}

Solution

  • struct{} requires 0 bytes to store. If you declare a map with struct{} values, you'd only be storing map keys.

    There's a nice blog post about it: https://dave.cheney.net/2014/03/25/the-empty-struct

    If you want to use a map like a set, it might help to declare a separate type for it:

    type IntSet map[int]struct{}
    

    And you can add some convenience methods to it, such as:

    func (i IntSet) Has(v int) bool {
      _, ok := i[v]
      return ok
    }