How to find intersection of two slices in Go

Created
Modified

Using map cache

It's a best method for intersection two slice. Time complexity is too low. Time Complexity : O(m+n)

package main

import "fmt"

func intersection(a, b []string) ([]string, error) {

  // uses empty struct (0 bytes) for map values.
  m := make(map[string]struct{}, len(b))

  // cached
  for _, v := range b {
    m[v] = struct{}{}
  }

  var s []string
  for _, v := range a {
    if _, ok := m[v]; ok {
      s = append(s, v)
    }
  }

  return s, nil
}

func main() {

  s1 := []string{"a", "b"}
  s2 := []string{"b", "c", "d"}

  // find s1 strings in s2
  s, _ := intersection(s1, s2)
  fmt.Println(s)

}
[b]

You can use reflect.TypeOf for any []T.

Using simple loops

Compare each element in A to each in B. For example,

package main

import "fmt"

func intersection(a, b []string) ([]string, error) {
  var s []string

  for _, m := range a {

    ok := false
    for _, n := range b {
      if m == n {
        ok = true
        break
      }
    }
    if ok {
      s = append(s, m)
    }

  }

  return s, nil
}

func main() {

  s1 := []string{"a", "b"}
  s2 := []string{"b", "c", "d"}

  // find s1 strings in s2
  s, _ := intersection(s1, s2)
  fmt.Println(s)

}
[b]

You can then create your own package and reuse once you settle how you want to implement it.

package intersection

func String(a []string, b []string) (inter []string, error)

func Int(a []int, b []int) (inter []int, error)

func Float64(a []Float64, b []Float64) (inter []Float64, error)

Related Tags