Hacker News new | ask | show | jobs
by uh_uh 1892 days ago
Why can't &3 work? Rob says 3 does not have a type and that's a problem. Would it be possible to change the Go compiler such that 3 has a type? (I'm guessing no, at least not easily, otherwise he'd be suggesting it, but I'm curious about the reason)
4 comments

> Would it be possible to change the Go compiler such that 3 has a type? (I'm guessing no, at least not easily, otherwise he'd be suggesting it, but I'm curious about the reason)

Why not? In fact it already kind-of does: Go has "default types" for most untyped constants. When you write

    i := 3
absent an explicit type, Go will fall back to "int".
From the language specification:

> Numeric constants represent exact values of arbitrary precision and do not overflow.

Ok I think I'm not understanding this correctly then. Why does this return an error?

    package main

    import (
        "fmt"
    )
    
    const tst = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    
    func main() {
        fmt.Println("%v", tst)
    }
Error: ./prog.go:16:17: constant 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 overflows int

See: https://play.golang.org/p/47l5qAsXD5r

https://golang.org/ref/spec#Constants

> An untyped constant has a default type which is the type to which the constant is implicitly converted in contexts where a typed value is required.

The default type for a number (integer) is int. If you were to add a period in that long string of zeros, the default for floating-point is float64.

I asked that in the thread, response here: https://github.com/golang/go/issues/45624#issuecomment-82259... With my reply (and further exploration) here: https://github.com/golang/go/issues/45624#issuecomment-82263...

tl;dr: Go uses casts to coerce values to the correct types, which means you couldn't get pointers to number literals for non-default number types.

If the syntax were &3, you could use it to obtain a *int, but not a *int32, *uint64 or such.