在Go中,有多种方法可以返回其struct值或片.对于我见过的个人:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Run Code Online (Sandbox Code Playgroud)
我理解这些之间的差异.第一个返回结构的副本,第二个返回指向函数内创建的结构值的指针,第三个期望传入现有结构并覆盖该值.
我已经看到所有这些模式都在各种环境中使用,我想知道关于这些模式的最佳实践是什么.你什么时候用哪个?例如,第一个可能适用于小结构(因为开销很小),第二个适用于较大结构.第三个是你想要非常高效的内存,因为你可以在调用之间轻松地重用一个struct实例.有什么时候使用哪种最佳做法?
同样,关于切片的相同问题:
func myfunc() []MyStruct {
return []MyStruct{ MyStruct{Val: 1} }
}
func myfunc() []*MyStruct {
return []MyStruct{ &MyStruct{Val: 1} }
}
func myfunc(s *[]MyStruct) {
*s = []MyStruct{ MyStruct{Val: 1} }
}
func myfunc(s *[]*MyStruct) {
*s = []MyStruct{ &MyStruct{Val: 1} }
}
Run Code Online (Sandbox Code Playgroud)
再说一次:这里的最佳做法是什么.我知道切片总是指针,所以返回指向切片的指针是没用的.但是,如果我返回一片struct值,一块指向结构的指针,我应该将指向切片的指针作为参数传入(Go …
在很多场合,我有一系列功能,我想以不同的方式实现.最明显的例子是从特定数据库中抽象出来.在面向对象的语言中,您将使用一个接口:
interface DB {
ResultSet query(String query);
void persist(Object o);
...
}
Run Code Online (Sandbox Code Playgroud)
在speudo代码中,我想做这样的事情:
(ns dbbackend)
(abstractfn query [q])
(abstractfn persist! [o])
Run Code Online (Sandbox Code Playgroud)
然后是每个数据库的实现:
(ns dbbackend.mysql :implements dbbackend)
(defn query [q] ...)
(defn persist! [o] ...)
Run Code Online (Sandbox Code Playgroud)
对我来说,最好的做法是用功能语言,特别是Clojure做类似的事情,这一点并不完全清楚.我应该使用多种方法吗?
对于常规网站,有各种工具可以对应用程序执行自动UI测试,例如Selenium.但是,我如何为Chrome Packaged Apps执行此操作?我的应用程序大量使用特定于Chrome应用程序的API,因此将其作为常规网页托管进行测试将无法正常工作.
这方面的最佳实践或工具?