Go言語で、func Greeting(say string, who ...string)のような可変長引数を持つ関数に 変数で値を渡す方法がわからず四苦八苦したのでメモ。乱筆気味ですが失礼します。

回答

func Greeting()では二番目要素以降が可変長として...stringと定義しているため、 関数から呼び出す時には、変数(ここではmembers)にも...をつけて引き渡す必要あります。

package main

import (
	"fmt"
	"strings"
)

func Greeting(say string, who ...string) {
	fmt.Printf("%s %s\n", say, strings.Join(who, ", "))
}

func main() {
	members := []string{"Aさん", "Bさん"}
	Greeting("こんにちは!", members...)
}

試行錯誤編

とりあえず可変長引数で渡して、正常動作することを確認してみます。

func main() {
  Greeting("こんにちは!", "Aさん", "Bさん")
}
$ go run main.go
こんにちは! Aさん, Bさん

しかし、以下のような呼び出し方をすると、cannot use members (type []string) as type string in argument to Greetingとエラーになり実行できません。

func main() {
	members := []string{"Aさん", "Bさん"}
	Greeting("こんにちは!", members)
}

指定の型に問題があるのかと思い、以下のようなコードを試してみましたが、やはりfunc Greeting(say string, who ...string)who[]string型となり前述のコードとの差異が理解できず悩む羽目になりました。

package main

import (
	"fmt"
	"reflect"
)

func Greeting(say string, who ...string) {
	fmt.Println(reflect.TypeOf(who))
}

func main() {
	Greeting("こんにちは!", "Aさん", "Bさん")
}
$ go run main.go
[]string

いろいろと調べ他結果、以下の文章を発見しました。

If the final argument is assignable to a slice type []T, it may be passed unchanged as the value for a …T parameter if the argument is followed by …. In this case no new slice is created.

ちょっとGoogle翻訳にかけて、、、

最後の引数がslice型[]Tに代入可能な場合は、引数の後ろに…が続く場合は …Tパラメータの値としてそのまま渡されます。この場合、新しいスライスは作成されません。

結局、私は []string...stringの型は等価だと誤認していた事が原因でした。
もっと注意深くエラーメッセージを読んでいれば、type string in argumentin argument の部分で気がついたのかもしれませんね、、、

参考

以上。