nil check left and right 之间的任何区别

Any difference between nil check left on right

这个函数接受两个字符串和 returns 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
}

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

    if nil != orgFundingsRefIdPending{
// logic
}

但我的问题是,如果我这样检查是否相同?

    if orgFundingsRefIdPending != nil{
//logic
}

如果左侧为nil,检查我的结果是右侧,或者我的结果是左侧,检查nil 是右侧,是否相同?如果我把 ‍‍‍‍‍nil 放在两边,这是否意味着同样的事情会发生?另外,如果我在仅使用功能上使用结构,它是否有效?

getCompareOrgFundingsByRefID() 函数 return 是一个指针和一个 error 值。要检查 return 值(指针)是否为 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 == bb == a 是等价的。

如果运算符不是自反的(例如 < 所以 a < bb < a 不同),则顺序很重要,或者如果不是所有操作数都是需要它的结果,例如逻辑 OR (||),因为我们知道如果 || 的任何操作数是 true,则结果是 true 而不管另一个值。由于 Go 的 || 运算符使用短路评估(如果在评估所有操作数之前已知结果,则不评估其余部分,从左到右),顺序在 [=26 的情况下很重要=].例如。在f() || g() if f() returns true中,g()函数将不会被调用。

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

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

有关详细信息和更多选项,请参阅