go 关于函数返回 error 的一个疑问

136 天前
 yujianwjj
type A struct {
	a int
}

func f() (*A, error) {
	// do something
	// if err != nil {
	// 	return nil, err
	// }
	return nil, nil
}

func TestX(t *testing.T) {
	a, err := f()
	if err != nil {
		t.Log(err)
	} else {
		t.Log(a.a) // 这里 a 为 nil ,所以 a.a 非法访问,崩溃
	}
}

go 关于错误处理,似乎默认都是大家约定,如果 err != nil ,另外一个值是正常的值,但是理论上来说,即使 err = nil ,另外一个值也不一定是合理的值。感觉下面的写法似乎更好一点。

func TestX(t *testing.T) {
	a, err := f()
	if a == nil {
		t.Log(err)
	} else {
		t.Log(a.a)
	}
}
1972 次点击
所在节点    Go 编程语言
22 条回复
eddievim
135 天前
你的场景应该是只在乎返回值是不是 nil, 那可以 a, _ := f(),对错误进行忽略即可
body007
135 天前
我之前也有过疑问,但我尽量规范自己的代码,当 err != nil 时其他返回值数据必须正确,如果有特殊情况,我会返回特殊 err ,在 err != nil 代码块内部使用 errors.Is(err, 特殊错误),我感觉这样代码更清晰易懂。

直到我需要用到标准库的这个字段时,翻看源代码发现有 nil,nil 的场景。



于是我的代码就返回了不规范的 nil,nil 了



所以 Go 这个没有强制规范略微蛋疼,即使规范了,标准库也在违反规范。我们可以善用 golangci-lint 检查这些存疑的代码吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055644

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX