Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

go-redis Eval func return value type, when Lua script returns an array

When a Lua script returns a table array during an Eval call, how can it be converted to a []string in go?

The redis cli returns bulk replies in the following format.

1) val1
2) val2 

Will go-redis eval function return the bulk entries as

["val1", "val2"] 
like image 424
TruBlu Avatar asked Oct 24 '25 08:10

TruBlu


1 Answers

Redis returns Lua table arrays as RESP2 arrays. The Go client then will map that response to Go native types. The relevant documentation for go-redis is found here: Lua and Go types.

The tl;dr is that Lua tables are indeed mapped to a bulk reply, and the Go client maps that to a slice of interface: []interface{}.

Both go-redis script Run and Eval return a *Cmd. You can use methods on this type to retrieve the output as Go types. Result gives (interface{}, error), which you can type-assert to whatever you want, otherwise, StringSlice is a convenience getter to retrieve []string right away.

So it looks like:

script := redis.NewScript(`
  local foo = {"val1", "val2"}
  return foo
`)

cmd := script.Run(/* parameters */)

i, err := cmd.Result() // (interface, error)
// or
ss, err := cmd.StringSlice() // ([]string, error)

If the values aren't actually all strings, use Slice to get the []interface{} slice, and then inspect the elements individually.

like image 50
blackgreen Avatar answered Oct 26 '25 00:10

blackgreen



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!