Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check whether a string slice contains a certain value in Go

Tags:

slice

go

set

What is the best way to check whether a certain value is in a string slice? I would use a Set in other languages, but Go doesn't have one.

My best try is this so far:

package main  import "fmt"  func main() {     list := []string{"a", "b", "x"}     fmt.Println(isValueInList("b", list))     fmt.Println(isValueInList("z", list)) }  func isValueInList(value string, list []string) bool {     for _, v := range list {         if v == value {             return true         }     }     return false } 

http://play.golang.org/p/gkwMz5j09n

This solution should be ok for small slices, but what to do for slices with many elements?

like image 518
deamon Avatar asked Nov 22 '12 21:11

deamon


People also ask

How do you check if a string array contains a value Golang?

To check if array contains a specific element in Go, iterate over elements of array using a for loop, and check for the equality of values using equal to operator. If there is a match, we may stop the search and conclude that the element in present in the array.

Is string a slice in Golang?

The slice is a variable-length sequence which stores elements of a similar type, you are not allowed to store different type of elements in the same slice. In the Go slice, you can search an element of string type in the given slice of strings with the help of SearchStrings() function.


1 Answers

If you have a slice of strings in an arbitrary order, finding if a value exists in the slice requires O(n) time. This applies to all languages.

If you intend to do a search over and over again, you can use other data structures to make lookups faster. However, building these structures require at least O(n) time. So you will only get benefits if you do lookups using the data structure more than once.

For example, you could load your strings into a map. Then lookups would take O(1) time. Insertions also take O(1) time making the initial build take O(n) time:

set := make(map[string]bool) for _, v := range list {     set[v] = true }  fmt.Println(set["b"]) 

You can also sort your string slice and then do a binary search. Binary searches occur in O(log(n)) time. Building can take O(n*log(n)) time.

sort.Strings(list) i := sort.SearchStrings(list, "b") fmt.Println(i < len(list) && list[i] == "b") 

Although in theory given an infinite number of values, a map is faster, in practice it is very likely searching a sorted list will be faster. You need to benchmark it yourself.

like image 117
Stephen Weinberg Avatar answered Sep 19 '22 07:09

Stephen Weinberg