That is correct. The relevant part of 
https://golang.org/ref/spec#Passing_arguments_to_..._parameters is where it 
says: " respective parameter passing rules 
<https://golang.org/ref/spec#Passing_arguments_to_..._parameters> apply". 
This links to 
https://golang.org/ref/spec#Passing_arguments_to_..._parameters which says:

"Otherwise, the value passed is a new slice of type []T with a new 
underlying array whose successive elements are the actual arguments, which 
all must be assignable <https://golang.org/ref/spec#Assignability> to T."

So in the OP's example https://play.golang.org/p/59bpr8TCIge, the function 
A() is assigning a []string to the variadic ...[]interface{}. Since string 
is assignable to interface{}. this is fine. The function B() is assigning a 
[]interface{} to the variadic of ...[]string. Since interface{} is *not 
*assignable 
to string, this is not allowed. 

Hope that clarifies. 


On Wednesday, October 24, 2018 at 9:11:50 AM UTC-4, Robert Engels wrote:
>
> But it is the varadic one that works according to OP. 
>
> On Oct 24, 2018, at 4:19 AM, Jan Mercl <[email protected] <javascript:>> 
> wrote:
>
> On Wed, Oct 24, 2018 at 7:34 AM Mayank Jha <[email protected] 
> <javascript:>> wrote:
>
> > why does A() not work while B works here, 
> https://play.golang.org/p/59bpr8TCIge 
>
> Type mismatch. The compiler is clear about it:
>
>         prog.go:8:12: cannot use s (type []string) as type []interface {} 
> in append
>
> From https://golang.org/ref/spec#Appending_and_copying_slices
>
> ----
> The variadic function append appends zero or more values x to s of type S, 
> which must be a slice type, 
> and returns the resulting slice, also of type S. The values x are passed 
> to a parameter of type ...T
> where T is the element typeof S and the respective parameter passing rules 
> apply. As a special case,
> append also accepts a first argument assignable to type []byte with a 
> second argument of string type
> followed by .... This form appends the bytes of the string.
> ---
>
> In the OP code, type T is `interface{}`, but the appended elements have 
> type `string`. That violates the above quoted specs.
>
>
> -- 
>
> -j
>
> -- 
> 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 [email protected] <javascript:>.
> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to