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 == b
和 b == a
是等价的。
如果运算符不是自反的(例如 <
所以 a < b
与 b < 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
}
}
有关详细信息和更多选项,请参阅
这个函数接受两个字符串和 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 == b
和 b == a
是等价的。
如果运算符不是自反的(例如 <
所以 a < b
与 b < 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
}
}
有关详细信息和更多选项,请参阅