For loop of two variables in Go

Go

Go Problem Overview


The following for loop in Go isn't allowed,

for i := 0, j := 1; i < 10; i++, j++ {...}

What's the correct equivalent of the for-loop of two variables below?

for (int i = 0, j = 1; i < 10; i ++ , j ++) {...} 

Go Solutions


Solution 1 - Go

You don't have a comma operator to join multiple statements, but you do have multiple assignment, so this works:

package main

import (
	"fmt"
)

func main() {
	for i, j := 0, 1; i < 10; i, j = i+1, j+1 {
		fmt.Println("Hello, playground")
	}
}

Solution 2 - Go

Although above Answer is accepted, and it fully satisfy the need. But I would like to contribute some further explanation to it.

Golang Does not support many things which could be done in simple terms. For loop is a most common example of this. The beauty of Go's For loop is that it merges many modern style of looping into one keyword.

Similarly Golang do with Multiple Variable declaration and assignment. According to above mentioned problem, We could solve multi-variable for loop with this simple tool which Golang provides us. If you want to look into further explanation, this question provide further details and way of declaring multiple variables in one statement.

Coming back to for loop, If we want to declare variable of same datatype we can declare them with this

var a,b,c string

but we use short hand in for loop so we can do this for initializing them with same value

  i,j := 0,1

Different Datatypes and Different Values

and if we want to declare different type of variables and want to assign different values we can do this by separating variables names and after := different values by comma as well. for example

 c,i,f,b := 'c',23423,21.3,false

Usage of Assignment Operator

Later on, we can assign values to multiple variables with the same approach.

    x,y := 10.3, 2
    x,y = x+10, y+1

Mixing Struct and Normal types in single statement

Even we can use struct types or pointers the same way. Here is a function to iterate Linked list which is defined as a struct

func (this *MyLinkedList) Get(index int) int {
    for i,list := 0,this; list != nil; i,list = i+1,list.Next{
        if(i==index){
            return list.Val
        }
    }
    return -1
}

This list is defined as

type MyLinkedList struct {
      Val int
      Next *MyLinkedList
     
 }
 

Answering to Original Problem

Coming to the origin Question, Simply it could be done

for i, j := 0, 1; i < 10; i, j = i+1, j+1 {
        fmt.Println("i,j",i,j)
    }

Solution 3 - Go

Suppose you want to loop using two different starting index, you can do this way. This is the example to check if string is palindrome or not.

name := "naman"
for i<len(name) && j>=0{
    if string(name[i]) == string(name[j]){
        i++
        j--
        continue
    }
    return false
}
return true

This way you can have different stopping conditions and conditions will not bloat in one line.

Solution 4 - Go

As pointed by Mr. Abdul, for iterate among two variable you can use the following construct:

var step int = 4
for row := 0; row < rowMax; row++ {
		for col := 0; col < colMax; col++ {
			for rIndex, cIndex := row, col; rIndex <= row+step && cIndex <= col; rIndex, cIndex = rIndex+1, cIndex+1 {
			}
		}
	}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsofView Question on Stackoverflow
Solution 1 - GotwotwotwoView Answer on Stackoverflow
Solution 2 - GoAbdul RehmanView Answer on Stackoverflow
Solution 3 - GoMayank PantView Answer on Stackoverflow
Solution 4 - GoalessiosaviView Answer on Stackoverflow