How do I get the terminal size in Go. In C it would look like this:
struct ttysize ts;
ioctl(0, TIOCGWINSZ, &ts);
But how to i access TIOCGWINSZ in Go
これを行う最良の方法は、syscallパッケージを使用することです。syscallパッケージは、非常に多くの異なることを行うため、ioctl関数を定義しませんが、それでも次のように呼び出すことができます。
syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(TIOCGWINSZ), uintptr(unsafe.Pointer(&ts)))
残っている2つのことは、winsize構造と必要な定数を複製することです。このためのツールはgodefsであり、Cヘッダーの構造と定数を調べて.goソースファイルを生成します。次のようなtermios.cファイルを作成します。
#include <termios.h>
enum {
$TIOCGWINSZ = TIOCGWINSZ
};
typedef winsize $winsize;
今すぐ実行
godefs -gpackagename termios.c > termios.go
これで、端末のサイズを取得するために必要なものがすべて揃っているはずです。サイズの設定は、termios.cに別の定数を追加するのと同じくらい簡単です。
読む: http://www.darkcoding.net/software/pretty-command-line-console-output-on-unix-in-python-and-go-lang/
const (
TIOCGWINSZ = 0x5413
TIOCGWINSZ_OSX = 1074295912
)
type window struct {
Row uint16
Col uint16
Xpixel uint16
Ypixel uint16
}
func terminalWidth() (int, error) {
w := new(window)
tio := syscall.TIOCGWINSZ
if runtime.GOOS == "darwin" {
tio = TIOCGWINSZ_OSX
}
res, _, err := syscall.Syscall(syscall.SYS_IOCTL,
uintptr(syscall.Stdin),
uintptr(tio),
uintptr(unsafe.Pointer(w)),
)
if int(res) == -1 {
return 0, err
}
return int(w.Col), nil
}
ドキュメンテーションをざっと見ただけでは、これに関してまだ多くの作業が行われているようには見えません。実際、まったく見つけることができませんioctl
。
このように初期段階にある言語では、未踏の地を踏んでいると言っても過言ではありません。TIOCGWINSZ
、それ自体は単なる整数です (Linux ソース コードでその値を見つけました)。
#define TIOCGWINSZ 0x5413
しかし、幸運を祈ります。