小编Zef*_*mel的帖子

指针与参数和返回值中的值

在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 …

pointers go

295
推荐指数
4
解决办法
6万
查看次数

Clojure中的抽象函数或函数接口?

在很多场合,我有一系列功能,我想以不同的方式实现.最明显的例子是从特定数据库中抽象出来.在面向对象的语言中,您将使用一个接口:

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做类似的事情,这一点并不完全清楚.我应该使用多种方法吗?

clojure

9
推荐指数
2
解决办法
1111
查看次数

数据绑定是否与MVC根本不兼容?

数据绑定在视图和模型之间建立直接耦合,从而绕过控制器.从根本上说,这打破了模型 - 视图控制器的架构模式,我是否正确地思考这个问题?这会使数据绑定成为"坏事"吗?

编辑:例如,angular声称是MVC框架,但其主要功能之一是数据绑定.

data-binding model-view-controller design-patterns

9
推荐指数
2
解决办法
2075
查看次数

如何自动测试Chrome打包应用?

对于常规网站,有各种工具可以对应用程序执行自动UI测试,例如Selenium.但是,我如何为Chrome Packaged Apps执行此操作?我的应用程序大量使用特定于Chrome应用程序的API,因此将其作为常规网页托管进行测试将无法正常工作.

这方面的最佳实践或工具?

google-chrome-app

5
推荐指数
1
解决办法
1529
查看次数