golang中的接口值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参数时,w就不是空接口了,因为它有类型了,但是动态值是一个空指针 nil func test(w io.Writer) { if w != nil { fmt.Println( "执行了·" ) w.Write([]byte( "ok" )) } } func main() { // 浅谈golang中的接口值由两部分组成:接口的类型、接口的类型对应的值(动态类型、动态值) // 一个接口为空,和一个接口包含空指针是否是一回事呢? // 不是一回事,空接口动态类型和动态值都为空,非空接口动态类型不为空或者动态类型和动态值都不为空 //var buf *bytes.Buffer // 动态类型:*bytes.Buffer 动态值:nil buf := new(bytes.Buffer) // 动态类型:*bytes.Buffer 动态值:是指向新分配的缓冲区的指针 test(buf) // 动态类型:*bytes.Buffer 动态值:空指针 } |
案例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package main import "fmt" type Test interface {} type Test1 interface { TestFunc() } type Structure struct { a int } func (s *Structure) TestFunc() { fmt.Println( "Ok, Let's rock and roll!" ) } func fTest(t Test) { fmt.Println(t == nil) } func fTest1(t1 Test1) { fmt.Println(t1 == nil) } func fStructure(s *Structure) { fmt.Println(s == nil) } func main() { var t Test fmt.Println(t == nil) // true: 此时t是一个空接口 var s *Structure = nil fTest(s) // false: 因为动态类型为:*Structure 动态值为:nil, 所以它不是一个空接口 fTest1(s) // false: 因为动态类型为:*Structure 动态值为:nil, 所以它不是一个空接口 fStructure(s) // true: 因为它是结构体指针类型,所以它的值为空 == nil s.TestFunc() // Ok, Let's rock and roll! } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)