https://golang.org/ref/spec#Type_definitions
> A type definition creates a new, distinct type with the same underlying
type and operations as the given type, and binds an identifier to it. […]
The new type is called a *defined type*. It is different from any other
type, including the type it is created from.

This seems to imply, when taking as the sole definition of the word
"defined type", that predeclared identifiers are in fact *not* defined
types, as they don't originate from a type definition. I agree with
Christoph here - if you follow any "defined type" link to this definition,
which is formatted as a definition (italics are a classical typographical
hint to denote a term being defined), that definition prevents any of the
predeclared types from being considered "defined types".

However:

https://golang.org/ref/spec#Boolean_types
> […] The predeclared boolean type is bool; it is a defined type.
https://golang.org/ref/spec#Numeric_types
> […] To avoid portability issues all numeric types are defined types […]
https://golang.org/ref/spec#String_types
> […] The predeclared string type is string; it is a defined type. […]
https://golang.org/ref/spec#Errors
…hmmmmmmmm. I assume it doesn't make a difference here, as it's an
interface type, so other parts of the spec apply wherever it's important.
I'll play around for a bit :)

So, while the actual definition *is* ambiguous, the spec as a whole is not
- it very clearly states that the predeclared types are defined types.
Note, that the section "predeclared identifiers" itself is not important
here - being declared and being defined are different words and `errors` is
predeclared, but, apparently, not defined. Language lawyering this way is
annoying, but it's also what writing a spec is all about. "defined" and
"declared" are similar, but distinct terms.

For clarity, it might make sense to amend the definition-looking section of
the spec with a blurb in the spirit of "defined types are those arising
from a type definition, or the predeclared types yadayadayada" (where
yadayadayada could be a list, could be the empty string if we resolve the
error ambiguity or could be "except error"). That way, if someone uses a
"defined type" link to see what it means (as Christoph did here for
assignability) they'll get an immediate answer about the implications.

On Fri, May 8, 2020 at 4:43 PM Jan Mercl <0xj...@gmail.com> wrote:

> On Fri, May 8, 2020 at 4:31 PM Christoph Berger
> <christophberger....@gmail.com> wrote:
>
> > Unfortunately, the connection between "predeclared" (or "implicitly
> declared" as the first paragraph says) and "defined" is not at all obvious.
> Especially as the definition of "defined type" refers to types explicitly
> declared via the "type" keyword.
>
> The definition of "defined type" is correct and simple, no special
> rules exists. The predeclared identifier `int` is declared that way,
> except it's done by the compiler without the need to do it in user
> code. See here: https://godoc.org/builtin#int
>
> Of course, the builtin package is only a formal definiton, it has
> special treatment by the compiler, so doing the same in user code
> would be invalid. Still `int` is defined and treated as `type int
> something` and it's thus a defined(named) type.
>
> In the first approximation, any type represented by a name is a
> defined type. Later came type aliases, so now it's a bit more
> complicated b/c one can write also `type T = []U` where T is not a
> defined type b/c []U is not a defined type.
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAA40n-WzJAWpg4TEcW%2BZ2G-1zcUFNiSS0ezJtz6077Z4U3uwUQ%40mail.gmail.com
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEv%2B3xYRWsLGOR%3DajkR8m5KzpLbWUQAHyjWjb0WhodcJA%40mail.gmail.com.

Reply via email to