nil check left 和 right 之间有什么区别

Asa*_*hel -1 comparison null go

该函数接受两个字符串并返回 struct 或 nil,我在该函数内编写了一个 struct 仅供该函数使用。

\n
type OrgFundingsDetailsFCT struct {\n    ID           int     `db:"id"`\n    OrgProfileID int     `db:"org_profile_id"`\n    OrgID        int     `db:"org_id"`\n    RefID        string  `db:"ref_id"`\n    AmountUSD    float64 `db:"amount_usd"`\n    FundingDate  string  `db:"funding_date"`\n    Status       string  `db:"status"`\n    Round        string  `db:"round"`\n    CreatedBy    string  `db:"created_by"`\n}\n
Run Code Online (Sandbox Code Playgroud)\n
func (s *Server) getCompareOrgFundingsByRefID(refID, status string) (*OrgFundingsDetailsFCT, error) {\n    type orgFunding struct {\n        RefID  string `db:"ref_id"`\n        Status string `db:"status"`\n    }\n\n    var orgFundingsDetailsFCT OrgFundingsDetailsFCT\n\n    orgfunding := orgFunding{\n        RefID:  refID,\n        Status: status,\n    }\n\n    const query = `SELECT id,\n                    org_profile_id,\n                    org_id,\n                    ref_id,\n                    amount_usd,\n                    funding_date,\n                    status,round, \n                    created_by \n                    FROM org_fundings \n                    WHERE ref_id=:ref_id AND status=:status`\n\n    if err := s.db.NamedGet(&orgFundingsDetailsFCT, query, orgfunding); err == sql.ErrNoRows {\n        s.logger.Infof("empty rows! getCompareOrgFundingsByRefID #111 %+v", err)\n        return nil, nil\n    } else if err != nil {\n        s.logger.Infof("errors found! getCompareOrgFundingsByRefID#111  %+v", err)\n        return nil, err\n    }\n    return &orgFundingsDetailsFCT, nil\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在我正在检查这个函数是否nil像这样返回

\n
    if nil != orgFundingsRefIdPending{\n// logic\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我的问题是我是否像这样检查是否相同?

\n
    if orgFundingsRefIdPending != nil{\n//logic\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果左侧为零并检查我的结果是右侧,或者,我的结果是左侧并检查为零是右侧,是否相同?这是否意味着如果我将 \xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d 放在任一侧,也会发生同样的事情nil?另外,如果我在仅使用函数上使用结构,它是有效的吗?

\n

icz*_*cza 5

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
}
Run Code Online (Sandbox Code Playgroud)

仅当两个操作数均被求值时,才能执行==and!=比较运算符(只能确定其结果)。此外,由于这些比较运算符是自反的(含义a == btrue仅且仅当b == a),因此顺序并不重要。所以a == bb == a是等价的。

如果运算符不是自反的(例如<soa < b与 不同b < a),则顺序很重要,或者如果其结果不需要所有操作数(例如逻辑 OR ( ||)),则顺序可能很重要,因为我们知道,如果其中任何一个||is的操作数true,结果true与其他值无关。由于 Go 的||运算符使用短路求值(如果在求值所有操作数之前已知结果,则不求其余操作数,从左到右),因此在 的情况下顺序确实很重要||。例如,在f() || g()if f()returns中true,该g()函数将不会被调用。

注意:回到你的情况,如果返回的指针不是nil,但你想检查指向的结构体值是否是其类型的零值,你可以简单地将它与OrgFundingsDetailsFCT{}

if orgFundingsRefIdPending != nil {
    // Use orgFundingsRefIdPending
    // Is it the zero value?
    if *orgFundingsRefIdPending == (OrgFundingsDetailsFCT{}) {
        // It's the zero value
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息和更多选项,请参阅如何检查空结构?