nil check left 和 right 之间有啥区别
Posted
技术标签:
【中文标题】nil check left 和 right 之间有啥区别【英文标题】:Any difference between nil check left on rightnil check left 和 right 之间有什么区别 【发布时间】:2022-01-24 05:58:10 【问题描述】:这个函数接受两个字符串并返回 struct 或 nil,我在这个函数内部写了一个结构体,仅供这个函数使用。
type OrgFundingsDetailsFCT struct
ID int `db:"id"`
OrgProfileID int `db:"org_profile_id"`
OrgID int `db:"org_id"`
RefID string `db:"ref_id"`
AmountUSD float64 `db:"amount_usd"`
FundingDate string `db:"funding_date"`
Status string `db:"status"`
Round string `db:"round"`
CreatedBy string `db:"created_by"`
func (s *Server) getCompareOrgFundingsByRefID(refID, status string) (*OrgFundingsDetailsFCT, error)
type orgFunding struct
RefID string `db:"ref_id"`
Status string `db:"status"`
var orgFundingsDetailsFCT OrgFundingsDetailsFCT
orgfunding := orgFunding
RefID: refID,
Status: status,
const query = `SELECT id,
org_profile_id,
org_id,
ref_id,
amount_usd,
funding_date,
status,round,
created_by
FROM org_fundings
WHERE ref_id=:ref_id AND status=:status`
if err := s.db.NamedGet(&orgFundingsDetailsFCT, query, orgfunding); err == sql.ErrNoRows
s.logger.Infof("empty rows! getCompareOrgFundingsByRefID #111 %+v", err)
return nil, nil
else if err != nil
s.logger.Infof("errors found! getCompareOrgFundingsByRefID#111 %+v", err)
return nil, err
return &orgFundingsDetailsFCT, nil
现在我正在检查这个函数是否像这样返回nil
if nil != orgFundingsRefIdPending
// logic
但我的问题是,如果我这样检查是否相同?
if orgFundingsRefIdPending != nil
//logic
如果左侧为 nil 并检查我的结果是右侧 OR,我的结果是左侧并且检查 nil 是右侧,是否相同?这是否意味着如果我将 nil
放在任何一边都会发生同样的事情?另外,如果我在仅使用功能上使用 struct 是否有效?
【问题讨论】:
nil
在 Go 中无效。也不清楚orgFundingsRefIdPending
的类型是什么。如果它的类型为orgFunding
,建议将类型定义移到函数外部(保持不导出)并根据结构的零值检查返回值
我更新了我的问题。它是结构。
Go 不是 Java,所以:是的。是的。不知道你在问什么。
【参考方案1】:
getCompareOrgFundingsByRefID()
函数返回一个指针和一个error
值。要检查返回值(指针)是否为nil
,只需将其与nil
进行比较,例如:
var refID, status string
// Set input params
orgFundingsRefIdPending, err := getCompareOrgFundingsByRefID(refID, status)
if err != nil
// Handle error
if orgFundingsRefIdPending != nil
// Use orgFundingsRefIdPending
==
和 !=
比较运算符只有在计算两个操作数时才能执行(只能确定其结果)。此外,由于这些比较运算符是自反的(意味着a == b
仅是true
且仅当b == a
时),顺序无关紧要。所以a == b
和b == a
是等价的。
如果运算符不是自反的,则顺序很重要(例如,<
所以a < b
与b < a
不同),或者如果不是所有操作数都需要其结果,例如逻辑或(||
),因为我们知道如果||
的任何操作数是true
,则无论其他值如何,结果都是true
。并且由于 Go 的 ||
运算符使用短路求值(如果在求值所有操作数之前知道结果,则不求值,从左到右),在||
的情况下顺序确实很重要。例如。在f() || g()
中,如果f()
返回true
,则不会调用g()
函数。
注意:回到 yoru 的例子,如果返回的指针不是nil
,但你想检查指向的结构值是否是其类型的零值,你可以简单地将它与OrgFundingsDetailsFCT
进行比较:
if orgFundingsRefIdPending != nil
// Use orgFundingsRefIdPending
// Is it the zero value?
if *orgFundingsRefIdPending == (OrgFundingsDetailsFCT)
// It's the zero value
有关详细信息和更多选项,请参阅How to check for an empty struct?
【讨论】:
如果我在```函数```上使用任何结构,这是有效的方法吗?此结构仅用于该功能。 @AsaduzzamanSohel 我不明白你的意思,你能举个具体的例子吗? 能否请您检查一下我的问题,我写了一个函数,并在该函数中创建了结构。我做了它在里面使用。这是在函数内部创建结构的有效方法吗? 是的,完全有效。以上是关于nil check left 和 right 之间有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
left join right join 和inner join之间的区别
inner join/ left join/right join 之间的区别