When you write a constant without an explicit type, Go can use its value in more than one numeric context. The value must fit the destination type, but you do not need a conversion just because the destinations have different numeric types. in The Golang Official Documentation
package main
import "fmt"
func main() {
const initial = 65
var small byte = initial
var large int64 = initial
fmt.Printf("%v %T\n", small, small)
fmt.Printf("%v %T\n", large, large)
}If you’ll run it with go run main.go, you’ll get:
65 uint8
65 int64initial is the untyped value 65. That value fits in a byte and in an int64, so both declarations work. Printing %T shows that small is a uint8 (the type named by byte) and large is an int64. The constant did not force both variables to have the same type.