В настоящее время компилятор 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. Лучше всего было бы заключить ioctl в функцию c, принимающую определенное количество аргументов, и связать ее с ней. В качестве хака вы можете сделать это в приведенном выше комментарии 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)
}
Я не проверял это, но что-то подобное должно работать.