zlatanski
zlatanski

Reputation: 845

Pattern for lookup in Go array

Go has convenient syntax to define array lookup tables:

var myTable = [...]string{
  'a': "aaaa",
  'b': "bbbb",
  'z': "zoro",
}

In some cases (where keys are in known and not too big range) this is more efficient way to make table, than map. However, it is easy to make lookup in map and find if key not in it. But to do lookup by index in this array I have to do:

if index < len(myTable) {
  if val := myTable[index]; val != "" {
    // here I know index exists in array and val is its value
  }
}

Is there simpler / more common pattern or library function to do this?

Upvotes: 3

Views: 356

Answers (2)

James Henstridge
James Henstridge

Reputation: 43899

I don't think there is any special builtin syntax to remove the need for a bounds check here. One option would be to wrap the code in a custom type. For example:

type StringTable []string

func (st StringTable) Get(i int) string {
    if i < 0 || i >= len(st) {
        return ""
    }
    return st[i]
}

You can still use the same initialiser syntax with the custom type:

myTable := StringTable{
    'a': "aaaa",
    'b': "bbbb",
    'z': "zoro",
}
fmt.Printf("%#v\n", myTable.Get('a'))
fmt.Printf("%#v\n", myTable.Get(-5))
fmt.Printf("%#v\n", myTable.Get('~')) // greater than 'z'

You can play around with this example here: http://play.golang.org/p/nhti2dVE8B

Upvotes: 3

BraveNewCurrency
BraveNewCurrency

Reputation: 13065

In some cases (where keys are in known and not too big range) this is more efficient way to make table, than map

Yes. You want to translate your key into an offset in the array. Then you can do the lookup in constant time.

Let's say you know all your keys will be in the set A-Z. So you create an array of 26 entries. When a key comes in, you subtract the ASCII value of "A" to get the index into your table. Boom, constant-time lookups, which will be much faster than a map lookup.

Note that you don't actually store the key anywhere, it's implicit. If you want to print out your table, you'd need to generate all keys (A-Z) yourself.

Upvotes: 0

Related Questions