7 ms·
Go maps in action
- gtaylor 14y agoVery helpful, thanks for posting this! The parts about map declaration vs. make() vs. new() are the most valuable tidbits, I think. A lot of the rest is mostly just very handy tips and pointers.
- wei2012 14y agoGo everyday, but still going.
- omaranto 14y agoThe fact that slices cannot be used as keys in maps was, for me, a fairly big turn off.
- jerf 14y agoUsing a slice as a key doesn't make much sense; a slice is a fundamentally-mutable view onto an underlying array, which itself may be mutable. Quick testing shows that you can use arrays: func main() { a := [4]int{1,2,3,4} m := make(map[[4]int]string) m[a] = "Hello" fmt.Println(m[[4]int{1,2,3,4}]) } Although that will be klunky, since the size of the array is in the type of the array. And still mutable. Mutating keys is bad. In all my years of using maps, I can't think of when I wanted to index by something that was truly an arbitrary-length array of things. If you want to index by something like a tuple of things, declare a datatype for that purpose. What exactly are you trying to do by using a slice as a key?
- omaranto 14y agoI was lazy when I complained about not be able to use slices as keys, I guess I really meant to complain that there is no arbitrary-length immutable sequence type that I can use as keys to a map (other than strings, which are sequences of characters and are allowed as keys to a map). For an example where you might want to do this consider storing a count of the frequency with which different words follow a given n-gram (sequence of n words) in some corpus, the sort of thing you'd need to make a Markov chain nonsense text generator (like the example programs in chapter 3 of The Practice of Programming: http://cm.bell-labs.com/cm/cs/tpop/code.html http://cm.bell-labs.com/cm/cs/tpop/code.html). Of course, you can always take your immutable sequences and represent them as strings, as other languages such as Perl, Awk and Lua force you to do. But I really like that I'm not forced to use such kludges in, say, Python or Haskell.
- car54whereareu 14y agohttp://play.golang.org/p/tLhF-JIRVv http://play.golang.org/p/tLhF-JIRVv forget using strings like Perl, Awk, and Lua.
- omaranto 14y agoSorry if I'm being stupid, but how does this solve the problem of using arbitrary/variable length sequences of, say, numbers as map keys?
- cmccabe 14y agoDoing m[f(a)] = b is not that much less convenient than m[a] = b. You can wrap it in a function if it seems easier. If f() seems expensive, then you should reconsider whether you should be using a (hash) map at all (or use a struct and cache the key value in there.)
- omaranto 14y agoJust to be clear: you are not explaining how car54whereareu's code solves the problem of using arbitrary length sequences as keys, but rather explaining a different solution, right? car54whereareu's code, which uses structs as keys doesn't seem to me as if it would work for variable length sequences given Go's types. Your solution is what I had in mind when I said above you can concert your keys to strings. The way I see it there are two cases for m[f(a)]: 1. f is injective: this pretty much forces f to return a string, since it must return a data type that is allowed as a key and that can represent arbitrary length sequences without loss of information. 2. f is not injective: then we're using f as a hash function and we need to store the full key inside the value (i.e., m[f(a)]=pair(a,b)) so look ups can make equality checks for the key. You also need to handle f-collisions somehow (I just described disallowing keys with the same f, but that may not work for certain applications). You are basically writing your own hash table at this point.
- cmccabe 14y ago
- deleted 14y ago[deleted]
- omaranto 14y agoAnother application of arbitrary-length sequences is storing sparse multivariable polynomials as maps from monomials to coefficients.
- shadowmint 14y agoI don't really get it. It's a hash. Big deal. I know what a hash is. Wow, Go has hashes. Yeah, I knew that too. blinks So... yeah. I mean, it's the Go blog, so cool. Blog about things in the language, but in terms of 'interesting things about Go' or 'interesting things about tech I expect to see on hacker news frontpage' this is pretty much a 0 for me...
- enneff 14y agoSo an article titled "Go maps in action" is about Go maps and... you're underwhelmed? Dissatisfied? This is an article for people who want to learn about Go maps. I'm not sure what you expected. You would be surprised how valuable these kinds of "entry level" articles are. I get more grateful mail about the basic articles than I do the advanced ones, because the audience is so much wider. So, not for you I guess.
- est 14y agoreminds me of people defending reposts on reddit. Yeah I've never seen it three minutes ago on frontpage, so the repost is OK for me and people like me. Maps in Go is definitely a good lesson for hackers who doesn't know about maps...