On Fri, May 3, 2019 at 10:24 AM Louki Sumirniy
<louki.sumirniy.stal...@gmail.com> wrote:
>
> Whenever I write appends and I'm splicing slices together, I often get an 
> error saying the second slice is the wrong type (it wants the slice element 
> type). So, doesn't that mean the trailing ellipsis is like an iterator 
> feeding out one element at a time? Is there some reason this is needed, 
> because if slice types match this unrolling is implicit, I mean, the 
> programmer obviously intends the two slices be spliced into one new one...

For this kind of discussion it helps to show code.

In a call like `append(to, from...)`, where `from` has type `[]byte`,
the slice `from` is passed directly to append.  In a call like
`append(to, a, b, c)`, where `a`, `b`, and `c` all have type `byte`,
the compiler implicitly creates a slice `[]byte{a, b, c}` and passes
that to append.  There is no iterator.

Ian


> On Friday, 3 May 2019 19:13:02 UTC+2, Ian Lance Taylor wrote:
>>
>> On Fri, May 3, 2019 at 7:57 AM Louki Sumirniy
>> <louki.sumi...@gmail.com> wrote:
>> >
>> > Ellipsis makes the parameter type into a slice, but in append it makes the 
>> > append repeat for each element, or do I misunderstand this?
>> >
>> > There is a syntactic distinction between them too. Parameters it is a 
>> > prefix to the type, append it is a suffix to the name. It neatly alludes 
>> > to the direction in which the affected variable is operated on - inside 
>> > the function name ...type means name []type and for append, we are 
>> > splitting the slice into a tuple (internally), at least as I understand 
>> > it, and the parameter is the opposite, tuple to slice.
>> >
>> > I sometimes lament the lack of a tuple type in Go (I previously worked a 
>> > lot with Python and PHP), but []interface{} isn't that much more difficult 
>> > and the ellipsis syntax is quite handy for these cases - usually loading 
>> > or otherwise modifying essentially a super simple container array.
>>
>> For any function F and some type T declared as
>>
>> func F(x ...T) {}
>>
>> within F x will have type []T.  You can call F with a slice s of type []T as
>>
>> F(s...)
>>
>> That will pass the slice s to F as the final parameter.  This works
>> for any variadic function F.
>>
>> The append function is implicitly declared as
>>
>> func append(to []byte, add ...byte)
>>
>> You can call it as
>>
>> append(to, add...)
>>
>> Here F is append and T is byte.
>>
>> There is a special case for append with an argument of type string,
>> but other than that append is just like any other variadic function.
>>
>> Ian
>>
>>
>>
>> > On Friday, 3 May 2019 16:44:47 UTC+2, Ian Lance Taylor wrote:
>> >>
>> >> On Fri, May 3, 2019 at 7:34 AM Louki Sumirniy
>> >> <louki.sumi...@gmail.com> wrote:
>> >> >
>> >> > The ellipsis has two uses in Go, one is in variadic parameters, the 
>> >> > other is in the slice append operator. It is essentially an iterator 
>> >> > that takes a list and turns it into a slice (parameters) or takes a 
>> >> > slice and turns it into a recursive iteration (append). Parameters with 
>> >> > the ellipsis are addressed inside the function as a slice of the type 
>> >> > after the ellipsis.
>> >>
>> >> Note that there is nothing special about append here, it's just like
>> >> passing a slice to any other variadic parameter.  See
>> >> https://golang.org/ref/spec#Passing_arguments_to_..._parameters .
>> >>
>> >> Ian
>> >
>> > --
>> > 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 golan...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>
> --
> 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.
> For more options, visit https://groups.google.com/d/optout.

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to