当前位置: 首页 > 面试题库 >

将字符串切片传递给可变参数空接口参数

平学
2023-03-14
问题内容

我正在使用的软件包gosqlite的方法带有 可变 参数,其类型为 空接口

func (s *Stmt) Exec(args ...interface{}) os.Error

如果显式传递各个参数,我可以称呼它为好:

statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine

但是,由于可变参数in我的SQL语句的运算符内的占位符相对应select,因此这些占位符的数目在编译时未知,但会在运行时根据用户的操作动态变化。例如,如果用户输入四个值,我最终会得到类似于以下的SQL:

SELECT * FROM sky WHERE name IN (?,?,?,?)

所以自然地我想Exec用一片字符串来调用该方法:

var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this

这不会编译。我可以通过创建一个空的接口片并复制引用来解决此问题:

values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not

这工作正常,但感觉有点笨拙。我想知道是否有一些技巧可以values直接传递给此函数,或者失败了,将字符串切片转换为空接口的更整洁的方法了吗?

非常感谢。


问题答案:

无法将a []string直接传递给...interface{}参数。这样做需要线性时间复制(具有n
+1个分配!)。如果语言对您隐藏了,那将是一笔巨大的隐性成本。通常,将切片传递给可变参数只是将切片传递给函数。

至于其他执行此操作的方法,可以通过编写一个接受a
[]string并返回相应的的函数来使其变得更整洁[]interface{}。当然,您必须为要执行的每个[]T->
[]interface{}转换再次编写它,但是它的功能很短,所有更改都是签名。您可以使用反射(带有固有的运行时成本)来使函数“通用”,例如:

valuesVal := reflect.ValueOf(values)
...
for i := range values2 { values2[i] = valuesVal.Index(i).Interface() }


 类似资料:
  • 问题内容: 我正在将ajax发布到webmethod上,我可以在客户端(通过Firebug)看到请求的状态为200,但未达到我的webmethod中的停止点(webmethod的第一行)。json参数一切正常,但是通过反序列化json的方式,我不得不将其更改为字符串。 js: aspx: 问题答案: 您在jQuery JSON帖子中缺少内容类型: 请参阅本文。当我遇到类似的问题时,它对我很有帮助:

  • 我想通过包装C 11中的std::thread类来使用我自己的Thread实现,这样我就可以像我想要的那样处理异常。 这是我的包装类: 如果没有争论,它的效果相当不错: …但如果我尝试传递可变参数: ...我在编译时收到一个错误: buildroot-2014.02/output/host/usr/i586-buildroot-linux-uclibc/include/c /4.8.2/funct

  • 问题内容: 我有一个功能。我想知道是否可以使用切片来填充参数列表。 我正在尝试解决以下程序。基本上是模仿一个普通的外壳,该外壳以字符串形式接收命令。 命令功能需要一个参数“列表”,我看不到如何将字符串转换为这样的列表 问题答案: Go编程语言规范 将参数传递给…参数 如果f是最终参数类型为… T的可变参数,则该函数中的参数等效于[] T类型的参数。在f的每次调用中,传递给最终参数的参数是[] T类

  • 问题内容: 我想将字符串数组作为参数传递给函数。请看下面的代码 代替: 但是如果我这样做,我会收到一条错误消息,指出将其转换为。我想知道是否可以传递这样的值,或者正确的方法是什么? 问题答案: 怎么样:

  • 问题内容: 我正在尝试使用jQuery Ajax将字符串参数数组传递给C#ASP.NET Web服务。这是我的示例Web方法。请注意,该函数接受可变数量的参数。运行jquery时,我在Chrome的JavaScript控制台中收到500 Internal Server Error。我正在使用jquery 1.6.2和.NET3.5 这是jQuery: 任何帮助表示赞赏! 问题答案: 修改后的服务器

  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对