如何获取Go语言内部结构体poll.FD的大小?
获取Go internal/poll.FD结构体大小的可行方法
方法1:使用Delve调试器直接计算
你之前用len <variable>的方式是错误的,Delve支持直接调用unsafe.Sizeof获取类型大小,且能直接访问内部包的类型。
操作步骤:
- 启动Delve调试目标程序,比如运行
dlv exec ./your-go-program进入交互模式 - 在Delve命令行中执行:
或者直接在启动时执行表达式:(dlv) print unsafe.Sizeof(internal/poll.FD{})
执行后会直接输出该结构体的字节大小。dlv exec ./your-go-program --eval 'print unsafe.Sizeof(internal/poll.FD{})'
方法2:通过标准库类型间接反射获取
不需要导入内部包,利用依赖poll.FD的net标准库类型,通过反射间接拿到poll.FD的类型并计算大小:
package main import ( "net" "reflect" "unsafe" ) func main() { // 创建临时TCP连接获取底层poll.FD类型 listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { panic(err) } defer listener.Close() connChan := make(chan net.Conn) go func() { conn, _ := listener.Accept() connChan <- conn }() client, err := net.Dial("tcp", listener.Addr().String()) if err != nil { panic(err) } defer client.Close() serverConn := <-connChan defer serverConn.Close() // 反射获取TCPConn内部的fd字段类型 tcpConnVal := reflect.ValueOf(serverConn).Elem() fdField := tcpConnVal.FieldByName("fd") fdType := fdField.Type().Elem() // 计算结构体大小 size := unsafe.Sizeof(reflect.New(fdType).Elem().Interface()) println("poll.FD size:", size) }
运行这个程序就能输出poll.FD的大小,核心是通过标准库暴露的类型间接拿到内部结构体的类型信息,避开直接导入内部包的限制。
方法3:基于Go源码编译辅助工具
如果你本地有Go源代码,可以创建一个小工具直接导入内部包计算大小,通过模块替换绕过导入限制:
- 新建目录并初始化模块:
mkdir fd-size && cd fd-size go mod init fd-size - 执行模块替换,指向本地Go源码中的internal/poll路径(替换为你本地的Go源码路径):
go mod edit -replace=internal/poll=$GOROOT/src/internal/poll - 编写main.go:
package main import ( "internal/poll" "unsafe" ) func main() { println(unsafe.Sizeof(poll.FD{})) } - 编译运行即可得到结果。
内容的提问来源于stack exchange,提问作者nav
相关产品推荐
相关产品推荐

