You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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源代码,可以创建一个小工具直接导入内部包计算大小,通过模块替换绕过导入限制:

  1. 新建目录并初始化模块:
    mkdir fd-size && cd fd-size
    go mod init fd-size
    
  2. 执行模块替换,指向本地Go源码中的internal/poll路径(替换为你本地的Go源码路径):
    go mod edit -replace=internal/poll=$GOROOT/src/internal/poll
    
  3. 编写main.go:
    package main
    
    import (
        "internal/poll"
        "unsafe"
    )
    
    func main() {
        println(unsafe.Sizeof(poll.FD{}))
    }
    
  4. 编译运行即可得到结果。

内容的提问来源于stack exchange,提问作者nav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:45:21