golang中interface判断nil问题

本文探讨了Golang中interface的数据表示,说明了interface如何存储类型信息和数据,并详细阐述了如何判断interface是否为nil。文章通过示例解释了不同情况下interface与nil的关系,包括直接赋值nil、指针类型的nil以及非零值的接口类型,强调了只有当itable和data都为nil时,interface才等于nil。

interface数据的表示

参阅http://research.swtch.com/interfaces

在示例中,我们定义一个interface名为Stringer,同时定义一个符合其定义的Binary类型:

type Stringer  interface  {
     String() string
}
 
 
type Binary uint64
 
func (i Binary) String() string {
     return  strconv.Uitob64(i.Get(),  2 )
}
 
Go语言中,判断map中key是否存在有以下常用方法: ### 逗号ok值判断 使用双赋值语法 `value, ok := mapVariable[key]`,其中`value`是键对应的值,`ok`是布尔值,表示该键是否存在于map中。若`ok`为`true`,则表示键存在;若为`false`,则表示键不存在。示例代码如下: ```go package main import "fmt" func main() { personAge := map[string]int{ "Alice": 30, "Bob": 25, } age, exists := personAge["Alice"] if exists { fmt.Println("Alice exists with age:", age) } else { fmt.Println("Alice not found") } } ``` 还可以采用如下代码结构进行判断: ```go if v, ok := MapName[key]; ok { // key存在的操作 } else { // key不存在的操作 } ``` 以下是另一个完整示例: ```go package main import "fmt" func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, } if _, ok := m["a"]; ok { fmt.Println("key \"a\" exists") } else { fmt.Println("key \"a\" does not exist") } } ``` ### 封装函数判断 可以将判断逻辑封装成函数,方便复用。示例如下: ```go package main import "fmt" func mapKeyExist(mapValue map[string]interface{}, key string) (bool, interface{}) { if value, ok := mapValue[key]; ok { return true, value } else { return false, nil } } func main() { mapStr := map[string]interface{}{"name": "姓名", "days": 99, "amount": 12.34} keys := []string{"name", "days", "amount", "month"} for _, k := range keys { bol, val := mapKeyExist(mapStr, k) if bol { fmt.Printf("键 [ %s ] 存在,值为 [ %v ] \n", k, val) } else { fmt.Printf("键 [ %s ] 不存在 \n", k) } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值