Home > front end >  What does the underscore(_) do in for loop Golang?
What does the underscore(_) do in for loop Golang?

Time:02-14

I am just getting started learning the Golang language! In for loop, I saw sometimes adding an underscore or without underscore.

Whatever add _ or not, I got the same result.

package main

import (
    "fmt"
)

func main() {
    doSomething()
    sum := addValues(5, 8)
    fmt.Println("The sum is", sum)

    multiSum, multiCount := addAllValues(4, 7, 9)
    fmt.Println("multisum", multiSum)
    fmt.Println("multiCount", multiCount)
}

func doSomething() {
    fmt.Println("Doing Something")
}

func addValues(value1 int, value2 int) int {
    return value1   value2
}

func addAllValues(values ...int) (int, int) {
    total := 0
    for _, v := range values {
        total  = v
    }
    return total, len(values)
}
func addAllValues(values ...int) (int, int) {
    total := 0
    for v := range values {
        total  = v
    }
    return total, len(values)
}

All I know is I don't care about the index. Is that all? or there is something more what I have to know??

I really appreciate your help!

CodePudding user response:

For range over slices:

  1. In for v := range values { the v is the index of the element in the slice.
  2. In for _, v := range values { the v is the actual element value.
  3. In for i, v := range values { the i is the index and the v is the element.
  4. In for i, _ := range values { the i is the index of the element in the slice.

You can run this playground example to see the differences.


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

For more details see the spec.

CodePudding user response:

By placing underscore you are telling the compiler this: Ok, I'm aware that this function is returning something but I don't care! For example:

package main

import "fmt"

func main() {
    mul1, add1 := test_function(2, 3)
    fmt.Println(mul1, add1)

    mul2, _ := test_function(4, 5)
    fmt.Println(mul2)

    _, add3 := test_function(7, 8)
    fmt.Println(add3)
}

func test_function(a int, b int) (mul int, add int) {
    return a * b, a   b
}

CodePudding user response:

If you don't want to use the variable that iterates in the loop, you can use _ to simply let Go ignore it:

mySlice := [int]{1,3,4,59,5}
for _,x := range mySlice {
    fmt.Println(x)
}
  •  Tags:  
  • go
  • Related