Go语言编译报错:cannot use name([]string) as string?可变参数传参疑问
可变参数传参报错的核心原因
Go 语言的可变参数语法有两个完全相反的使用场景,混淆后就会触发这类编译错误:
- 函数定义端:在形参类型前加
...T,表示这个函数可以接收0个到N个T类型的入参;在函数内部,这些入参会被自动打包成[]T类型的切片供代码使用。也就是说在Greet函数体内,name变量的实际类型就是[]string,没有任何“可变参数”的特殊属性。 - 函数调用端:如果实参本身已经是一个同类型的切片,想要把它拆成独立的N个值传给带有可变参数形参的函数,必须在切片变量后面追加
...标记,显式告诉编译器“把这个切片拆解开,按多入参的形式传递”。
两个位置的...语法作用完全相反,不存在“两个函数都声明了...string,参数类型就可以直接匹配”的逻辑。你现在的代码里,调用CheckStringsAreUppercase(name)的时候没有加这个拆解标记,编译器会把name这个[]string类型的变量当成1个独立的入参传给目标函数。但目标函数的形参要求所有入参都是string类型,自然会抛出“不能把[]string类型的值当string类型传给参数”的编译错误。
正确的传参修正
把调用语句从
CheckStringsAreUppercase(name)
修改为
CheckStringsAreUppercase(name...)
即可匹配参数类型要求。
附带的代码逻辑偏差
你当前编写的CheckStringsAreUppercase函数存在逻辑问题:
- 遍历字符串时,只要发现某一个字符串不是全大写,代码直接返回
true - 只有所有字符串全部是大写的场景,循环走完才会走到最后返回
true - 这会导致只要碰到非大写的字符串就提前返回,完全起不到“校验是否全为大写”的作用。正确的逻辑应该是:碰到非大写字符串时返回
false,所有字符串遍历校验完成、确认全部大写后才返回true。
内容的提问来源于stack exchange,提问作者JakiLim
相关产品推荐
相关产品推荐

