gpt4 book ai didi

terminal - 你如何获得 Go 中的终端大小?

转载 作者:IT王子 更新时间:2023-10-29 00:43:11 25 4
gpt4 key购买 nike

如何在 Go 中获取终端大小。在 C 中它看起来像这样:

struct ttysize ts; 
ioctl(0, TIOCGWINSZ, &ts);

但是我如何在 Go 中访问 TIOCGWINSZ

最佳答案

cgo编译器目前无法处理c函数中的可变参数和c头文件中的宏,所以你不能做一个简单的

// #include <sys/ioctl.h>
// typedef struct ttysize ttysize;
import "C"

func GetWinSz() {
var ts C.ttysize;
C.ioctl(0,C.TIOCGWINSZ,&ts)
}

要绕过宏,请使用常量,所以

// #include <sys/ioctl.h>
// typedef struct ttysize ttysize;
import "C"

const TIOCGWINSZ C.ulong = 0x5413; // Value from Jed Smith's answer

func GetWinSz() {
var ts C.ttysize;
C.ioctl(0,TIOCGWINSZ,&ts)
}

然而,cgo 仍然会在 ioctl 原型(prototype)中的 ... 上呕吐。最好的办法是将 ioctl 包装成一个 c 函数,该函数接受特定数量的参数并将其链接进去。作为 hack,您可以在上面的注释中执行此操作 import "C"

// #include <sys/ioctl.h>
// typedef struct ttysize ttysize;
// void myioctl(int i, unsigned long l, ttysize * t){ioctl(i,l,t);}
import "C"

const TIOCGWINSZ C.ulong = 0x5413; // Value from Jed Smith's answer

func GetWinSz() {
var ts C.ttysize;
C.myioctl(0,TIOCGWINSZ,&ts)
}

我没有测试过这个,但类似的东西应该可以工作。

关于terminal - 你如何获得 Go 中的终端大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com