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 == bb == a 是等价的。

如果运算符不是自反的,则顺序很重要(例如,< 所以a < bb < 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 之间的区别

sql的left join right join inner join之间的区别

红黑树的删除算法

定位属性left,right,top,bottom