【golang基础】使用go获取终端软件窗口的长宽大小

本文介绍了如何在Golang中获取Linux和Windows终端窗口的大小。在Linux下,可以通过$LINES和$COLUMNS环境变量获取,而在Windows下则需要使用`mode con | find “Columns”`。由于os.Getenv无法直接获取未export的环境变量,作者转向使用Syscall来实现这一功能,并提供了简化版的代码。参考了多个资源,包括ishell库和相关的技术文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目使用了ishell,而要求能在数据量较大时,能分页显示,ishell自带ShowPaged函数可以分页显示,但是我想做到识别当前终端软件窗口的长宽大小,再判断是否需要进行分页显示。

根据查找资料,了解到,Linux下支持通过 $LINES 和 $COLUMNS 获取高宽;

[root@ ~]# echo $COLUMNS
80
[root@ ~]# echo $LINES
24

windows下是用mode con | find “Columns”,可能是汉字,如下:

C:\Users\hp>mode con

设备状态 CON:
---------
    行:        9001
    列:       120
    键盘速度:   31
    键盘延迟:  1
    代码页:     936

因此考虑去获取Linux下的环境变量,使用os.Getenv获取。但是,

package main

import (
    "fmt"
    "os"
)
func main() {
    var JAVAHOME string
    JAVAHOME = os.Getenv("JAVA_HOME")
    fmt.Println(JAVAHOME)

    var LINES string
    LINES = os.Getenv("LINES")
    fmt.Println(LINES)

    var COLUMNS string
    COLUMNS = os.Getenv("COLUMNS")
    fmt.Println(COLUMNS)

    var GOROOT string
    GOROOT = os.Getenv("GOROOT")
    fmt.Println(GOROOT)
}

但是os.Getenv获取失败了,全都是空值,但是PATH能获取到值,原来必须要export了的变量才行(具体原因何在暂时没有细究)。另外,os.Getenv配套的函数是os.Setenv,用于自定义环境变量,因此一般是先os.Setenv再os.Getenv。

遂,考虑他法。

搜来搜去,看到最多的就是下面使用Syscall获取窗口大小的方法。
以下代码为简化版本。

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)
type window struct {
    Row    uint16
    Col    uint16
}

func terminalWindowSize() (window, error) {
	win := window{0, 0}
	res, _, err := syscall.Syscall(syscall.SYS_IOCTL,
		uintptr(syscall.Stdin),
		uintptr(syscall.TIOCGWINSZ), //此参数,不同的操作系统可能不一样,例如:TIOCGWINSZ_OSX
		uintptr(unsafe.Pointer(&win)),
	)
	if int(res) == -1 {
		return window{0, 0}, err
	}

	return win, nil
}

func main() {
    res := getPageOfNum()
    fmt.Println(res)
}

参考链接:

  • ishell

https://github.com/abiosoft/ishell

  • Golang在linux系统上获取terminal终端的宽度

https://www.jianshu.com/p/40b699dde53d

  • 怎样读取windows和linux终端宽度?

https://studygolang.com/topics/4265/comment/12193

  • Golang通过使用GetSystemMetrics获取系统的分辨率

https://www.perfcode.com/p/1544.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值