Golang language specification Document: Composite Literals example is not understandable

221 views
Skip to first unread message

Vaibhav Maurya

unread,
Jun 22, 2021, 11:40:16 AM6/22/21
to golang-nuts
Hi,

Please help me to understand the following syntax mentioned in the Golang language specification document.


following is the search string for CTRL + F
// vowels[ch] is true if ch is a vowel \

Following declaration and initialization is confusing.
vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}

Here one can see the vowels is an array. Where in the array initialization syntax, there is a key value pair. I believe bool is the primitive type, so the array values should be either true or false.
Why there are key value pair separated by colon in the initialization.

Jan Mercl

unread,
Jun 22, 2021, 11:48:55 AM6/22/21
to Vaibhav Maurya, golang-nuts
On Tue, Jun 22, 2021 at 5:40 PM Vaibhav Maurya <vaibha...@gmail.com> wrote:

> https://golang.org/ref/spec#Composite_literals
>
> following is the search string for CTRL + F
> // vowels[ch] is true if ch is a vowel \
>
> Following declaration and initialization is confusing.
> vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}
>
> Here one can see the vowels is an array. Where in the array initialization syntax, there is a key value pair. I believe bool is the primitive type, so the array values should be either true or false.
> Why there are key value pair separated by colon in the initialization.

The key in, for example 'a': true is 'a'. 'a' is an untyped integer
literal havine value 0x61, ie. 97. So the example key is the same as
97: true. The meaning of such key/pair in the initializer of a
[128]bool typed value is to set index 97 to true.

This is specified, quoting from the link you provided, as:

""""
The key is interpreted as a field name for struct literals, an index
for array and slice literals, and a key for map literals.
""""

Axel Wagner

unread,
Jun 22, 2021, 11:50:15 AM6/22/21
to Vaibhav Maurya, golang-nuts
It's in the section you link to:

The key is interpreted as a field name for struct literals, an index for array and slice literals, and a key for map literals.

(emphasis mine). The syntax allows you to specify keys for arrays and slices and interprets them as indices. Rune-literals (like 'a') are integers, as `rune` is an alias for `int32`. 

On Tue, Jun 22, 2021 at 5:40 PM Vaibhav Maurya <vaibha...@gmail.com> wrote:
--
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...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/83571d7c-7dee-47f3-b105-4286320e88d6n%40googlegroups.com.

David Riley

unread,
Jun 22, 2021, 12:39:58 PM6/22/21
to Vaibhav Maurya, golang-nuts
On Jun 22, 2021, at 11:39, Vaibhav Maurya <vaibha...@gmail.com> wrote:

Hi,

In this case, it is because the single quotes create a literal rune, which ultimately is an integer; this is creating an array 128 wide of bools, of which only the values indexed by those character values are initialized (everything else is the zero value, or false).

This example only works for characters in the 7-bit ASCII subset of UTF-8; if you were to put other characters in which had rune values greater than 127, this would break (I assume with a runtime rather than a compiler error, but I haven’t tried it). Likewise, I think this only works for array literals; I don’t think (though again have not tried it) that you can declare slice literals with only selected members initialized.


- Dave

Axel Wagner

unread,
Jun 22, 2021, 12:42:13 PM6/22/21
to David Riley, Vaibhav Maurya, golang-nuts
(I assume with a runtime rather than a compiler error, but I haven’t tried it)

Nope, compiler catches the overflow:  https://play.golang.org/p/taorqygqxFz

--
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...@googlegroups.com.

Axel Wagner

unread,
Jun 22, 2021, 12:43:17 PM6/22/21
to David Riley, Vaibhav Maurya, golang-nuts
Oh and also:

Likewise, I think this only works for array literals; I don’t think (though again have not tried it) that you can declare slice literals with only selected members initialized.

David Riley

unread,
Jun 22, 2021, 12:49:32 PM6/22/21
to Axel Wagner, Vaibhav Maurya, golang-nuts
On Jun 22, 2021, at 12:42, Axel Wagner <axel.wa...@googlemail.com> wrote:


Oh and also:

Likewise, I think this only works for array literals; I don’t think (though again have not tried it) that you can declare slice literals with only selected members initialized.


Yeah, I re-read the doc and realized my assumption was erroneous shortly after I sent the last one… this is why I put the disclaimer on things I have not tried yet. :-)


- Dave

Bakul Shah

unread,
Jun 22, 2021, 2:04:37 PM6/22/21
to Vaibhav Maurya, golang-nuts
If you are familiar with C99’s designated initializers, this is similar but less general
and less confusing.

On Jun 22, 2021, at 8:40 AM, Vaibhav Maurya <vaibha...@gmail.com> wrote:

Hi,
--
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...@googlegroups.com.

jake...@gmail.com

unread,
Jun 22, 2021, 5:07:38 PM6/22/21
to golang-nuts
I'm surprised that I have never come across this as a way to create a slice with an initial length:

x := []int{100:0}

Rob Pike

unread,
Jun 22, 2021, 5:36:56 PM6/22/21
to jake...@gmail.com, golang-nuts
That creates a slice 101 integers long, which probably isn't what you meant, which might help explain why you never came across it before.

Smile.

-rob


Vaibhav Maurya

unread,
Jun 23, 2021, 1:06:40 AM6/23/21
to golang-nuts

I appreciate the whole discussion, it was really insightful. Since Golang is not my first language, I had a preconceived notion about key-value pair initialization.
Here I would like to disagree with the syntax, it would be good that with the innovation in the language, the general idea of an Array and slice should be maintained, instead of making certain syntaxes so weird.

This syntax is really unintuitive for me. the key-value pair structures give so many pictures like hashing, scattered memory allocations, etc.

Axel Wagner

unread,
Jun 23, 2021, 2:06:39 AM6/23/21
to Vaibhav Maurya, golang-nuts
FWIW I don't believe I ever saw key-value initialization of arrays or slices in the wild.
Not saying *no one* uses it, but it's certainly rare enough that I wouldn't worry about getting confused by it in practice.

Jan Mercl

unread,
Jun 23, 2021, 2:53:37 AM6/23/21
to Vaibhav Maurya, golang-nuts
On Wed, Jun 23, 2021 at 7:06 AM Vaibhav Maurya <vaibha...@gmail.com> wrote:

> I appreciate the whole discussion, it was really insightful. Since Golang is not my first language, I had a preconceived notion about key-value pair initialization.
> Here I would like to disagree with the syntax, it would be good that with the innovation in the language, the general idea of an Array and slice should be maintained, instead of making certain syntaxes so weird.

The composite literal syntax is in essence the same as what modern C
has for decades. Not sure what's weird about it.

Can you elaborate on "it would be good that with the innovation in the
language, the general idea of an Array and slice should be maintained"
or provide some examples of what you are thinking about?

> This syntax is really unintuitive for me. the key-value pair structures give so many pictures like hashing, scattered memory allocations, etc.

It's obviously subjective, but I wonder, how would the syntax, that
you would call intuitive, look like.

It may happen that you have some nice idea that's worth turning into a
proposal for improvement.

jake...@gmail.com

unread,
Jun 23, 2021, 12:03:02 PM6/23/21
to golang-nuts
No that is exactly what I meant. I would never use it, as it seems like obfuscation, but there are those who like to be clever.
Reply all
Reply to author
Forward
0 new messages