- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我们有一个返回一些值和错误的函数。处理错误和值声明的首选方式是什么?
func example_a(data interface{}) (interface{}, error) {
var err error
var bytes []byte
if bytes, err = json.Marshal(data); err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
func example_b(data interface{}) (interface{}, error) {
if bytes, err := json.Marshal(data); err != nil {
return nil, err
} else {
// ...
return use(bytes), nil
}
}
func example_c(data interface{}) (result interface{}, err error) {
var bytes []byte
if bytes, err = json.Marshal(data); err != nil {
return
}
// ...
return use(bytes), nil
}
func example_d(data interface{}) (interface{}, error) {
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
func example_dream(data interface{}) (interface{}, error) {
if bytes, err ≡ json.Marshal(data); err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
Example A 很清楚,但它增加了 2 行。此外,我发现不清楚为什么在这种特殊情况下我们应该使用 var
,同时 :=
并不总是合适的。然后你想在行的某个地方重用 err
声明,我不喜欢拆分声明和赋值。
Example B 使用了 if-declare-test 语言特性,我认为这是值得鼓励的,但同时你被迫嵌套函数继续,违反了快乐路径原则,这也是受到鼓励。
示例 C 使用命名参数返回功能,它介于 A 和 B 之间。这里最大的问题是,如果您的代码库使用样式 B 和 C,那么很容易出错 :=
和 =
,这可能会导致各种问题。
示例 D(从建议中添加)对我来说有与 C 相同的使用问题,因为我不可避免地会遇到以下问题:
func example_d(a, b interface{}) (interface{}, error) {
bytes, err := json.Marshal(a)
if err != nil {
return nil, err
}
bytes, err := json.Marshal(b) //Compilation ERROR
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
因此,根据之前的声明,我必须修改我的代码以使用 :=
或 =
,这使得查看和重构变得更加困难。
Example Dream 是我直觉上对 GO 的期望——没有嵌套,快速退出,没有太多冗长和变量重用。显然它无法编译。
通常 use()
被内联并多次重复该模式,从而加剧了嵌套或拆分声明问题。
那么处理这种多重返回和声明的最惯用的方法是什么?有没有我遗漏的模式?
最佳答案
如果您查看大量 Go 代码,您会发现以下是常见的情况:
func example(data interface{}) (interface{}, error) {
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}
declare and test if 结构在它的位置上很好,但它通常不适合这里。
关于go - 惯用语 Go Happy Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46024818/
Tcl 有 apply和 lambda , 但没有闭包。 从 tcl 8.6 开始,什么是惯用形式或闭包? 已发布 patterns看起来很困惑,下面的也是如此。 例子: #!/usr/bin/env
是否有可能以某种方式完成以下操作: x.hpp - 此文件包含在许多其他类中 class x_impl; //forward declare class x { public:
我使用 Idiorm作为 MySQL 和 PHP 的 ORM。 我需要检查表是否已创建。 在 SQL 中 这在 phpMyAdmin 中有效 SHOW TABLES LIKE 'ro_globals'
假设我们有一个返回一些值和错误的函数。处理错误和值声明的首选方式是什么? func example_a(data interface{}) (interface{}, error) { var
这样的事情存在吗? ruby : if __FILE__ == $0 main end Perl: unless(caller) { main; } 卢阿: if type(packa
我正在阅读以下问题: What is the copy-and-swap idiom? 我的印象是,当按值传递对象时,它的指针和值会被复制,但被传递对象的指针指向的内存不会被复制。因此,当从链接到示例
Java tryLock(long time, TimeUnit unit)可以用作获取锁的非阻塞尝试。如何实现python中的等价物? (首选 Pythonic | idiomatic 方式!) J
我正在阅读 J. Bloch 的《effective Java》一书,现在正阅读有关惰性初始化的部分。考虑以下类: public class LazyInit{ public static g
我最近一直在写一些 Clojure,我发现自己经常使用以下模式: (let [x (bam) y (boom)] {:x x :y y}) 所以我继续写了下面的宏: (defma
我开始玩 Go,对 new 函数有点恼火。它似乎非常有限,尤其是在考虑具有匿名字段或内联初始化的结构时。所以我通读了规范和 stumbled over the following paragraph
Python 库公开一个通用的“opener”函数并不少见,它接受一个字符串作为它们的主要参数,该字符串可以表示一个本地文件名(它将打开并对其进行操作),一个 URL(它将下载并对其进行操作)或数据(
我想了解一些 Perl 用于逐块读取文本文件的代码。 文本文件 MYFILE看起来像这样: First block First Line: Something in here Second Line:
我是一名优秀的程序员,十分优秀!