Nick
Nick

Reputation: 9051

How to get rid of zero value in a int slice in Go?

I am trying to find even numbers in a list of numbers, here is my attempt:

package main

import "fmt"

func main() {
    nums := []int{1, 2, 3, 4, 5, 6, 7}
    res := []int{}
    for n := range nums {
        if n%2 == 0 {
            res = append(res, n)
        }
    }
    fmt.Println(res)
}

It seems straightforward; however, when I run the program, I got the result

[0 2 4 6]

Where does the zero come from? It must be from the empty slice res. How can I get rid of this zero?

Upvotes: 0

Views: 628

Answers (1)

icza
icza

Reputation: 417662

for n := range nums {
    // ...
}

n is not the elements of the nums slice, it is the index. So basically you tested and added the indices of the elements to your res result slice.

Instead do this:

for _, n := range nums {
    // ...
}

With this change, output will be (try it on the Go Playground):

[2 4 6]

This is detailed in Spec: For statements, For statements with range clause:

For each iteration, iteration values are produced as follows if the respective iteration variables are present:

Range expression                          1st value          2nd value

array or slice  a  [n]E, *[n]E, or []E    index    i  int    a[i]       E
string          s  string type            index    i  int    see below  rune
map             m  map[K]V                key      k  K      m[k]       V
channel         c  chan E, <-chan E       element  e  E

Upvotes: 13

Related Questions