I have the following piece of code:
func generateBoard() {
for i := 0; i < 64; i++ {
}
}
func getRank(i int) uint8 {
return i / 8
}
In the loop I want to call getRank(i)
. I want getRank
return uint8
cause it's the least integer type and I don't need more. The problem is that I can't divide int
by uint8
. I don't want to cast i
to uint8
cause it might be expensive(possibly even an allocation happens there). Also I don't want to declare i
as uint8
before the loop like:
var i uint8
for i = 0; i < 64; i++ {
Cause I believe that on the low level initializing iterator in the loop is pretty optimized and declaring an iterator before would be also not the best solution.
What would be the best implementation of this?
You may declare getRank()
to take a value of type uint8
, and also you may use a typed constant when declaring the loop variable, so i
will be of type uint8
:
func generateBoard() {
for i := uint8(0); i < 64; i++ {
fmt.Println(getRank(i)) // Valid
}
}
func getRank(i uint8) uint8 {
return i / 8
}
Try it on the Go Playground.
You could also use the shift operator instead of dividing by 8:
func getRank(i uint8) uint8 {
return i >> 3
}
But this is a micro-optimization that is most likely recognized and used by the compiler too. So use whichever is more expressive in your context.