linux,windows命令行输出控制指令,带颜色的信息,多行刷新,进度条效果,golang

一、带颜色的信息
linux

颜色及模式编号

// 前景 背景 颜色
// ---------------------------------------
// 30  40  黑色
// 31  41  红色
// 32  42  绿色
// 33  43  黄色
// 34  44  蓝色
// 35  45  紫红色
// 36  46  青蓝色
// 37  47  白色
//
// 模式代码 意义
// -------------------------
//  0  终端默认设置
//  1  高亮显示
//  4  使用下划线
//  5  闪烁
//  7  反白显示
//  8  不可见

输出模板

// 其中0x1B是标记,[开始定义颜色,依次为:模式,背景色,前景色,0代表恢复默认颜色。
func (c ColorOutput) Println(str interface{}) {
	fmt.Println(fmt.Sprintf("%c[%d;%d;%dm%s%c[0m", 0x1B, c.mode, c.backColor, c.frontColor, str, 0x1B))
}
windows

在 cmd 下查看颜色编号

windows cmd下查看颜色编号: color /?

Sets the default console foreground and background colors.

COLOR [attr]

  attr        Specifies color attribute of console output

Color attributes are specified by TWO hex digits -- the first
corresponds to the background; the second the foreground.  Each digit
can be any of the following values:

    0 = Black       8 = Gray
    1 = Blue        9 = Light Blue
    2 = Green       A = Light Green
    3 = Aqua        B = Light Aqua
    4 = Red         C = Light Red
    5 = Purple      D = Light Purple
    6 = Yellow      E = Light Yellow
    7 = White       F = Bright White

If no argument is given, this command restores the color to what it was
when CMD.EXE started.  This value either comes from the current console
window, the /T command line switch or from the DefaultColor registry
value.

The COLOR command sets ERRORLEVEL to 1 if an attempt is made to execute
the COLOR command with a foreground and background color that are the
same.

Example: "COLOR fc" produces light red on bright white

设置字体颜色及背景色并输出

func SetCmdPrint(s interface{}, i int) {
	proc := kernel32.NewProc("SetConsoleTextAttribute")
	handle, _, _ := proc.Call(uintptr(syscall.Stdout), uintptr(i))
	fmt.Println(s)
	handle, _, _ = proc.Call(uintptr(syscall.Stdout), uintptr(7))
	CloseHandle := kernel32.NewProc("CloseHandle")
	CloseHandle.Call(handle)
}

查看当前操作系统类型

// darwin, windows, linux
if runtime.GOOS == "windows" {
	......
} else {
	......
}

想法是通过判断操作系统类型来执行对应的输出方法,在 windows 下可以正常运行,但是在 linux 下编译都通不过,报错

./ColorOutput.go:139:15: undefined: syscall.LazyDLL
./ColorOutput.go:187:13: undefined: syscall.NewLazyDLL

的确在Linux系统下 syscall.NewLazyDLL不存在。

那么现在的问题就是,如何告诉golang编译器基于是否是windows平台来选择性的编译或不编译某个文件呢?

实际上可以做到这一点,只需要在文件头部加上注解:

只在 windows 系统下编译此文件,则需要在文件头部加上
// +build windows

在非 windows 系统下编译此文件,则需要在文件头部加上
// +build !windows

类似于这样:test.go

// +build windows

pachage main

....

解决了这个问题之后,整合代码,又发现一个问题,如果不编译 ColorOutput_windows.go 文件,那么在这个文件中定义的方法又会报不存在了,但实际上也不会被调用,于是我们定义方法类型,然后在 ColorOutput_windows.go 文件中来实现即可。到此这个功能已经初步完成。

包地址:github.com/phprao/ColorOutput

使用

ColorOutput.Colorful.WithFrontColor("green").WithBackColor("red").Println("ColorOutput test...")

windows 系统
在这里插入图片描述
linux 系统
在这里插入图片描述

补充知识:
1、关于 SetConsoleTextAttribute

通过调用windows操作系统API设置终端文本属性,包括:前景色,背景色,高亮。可同时设置多个属性,使用竖线 | 隔开。

DOC: https://docs.microsoft.com/zh-cn/windows/console/setconsoletextattribute
Usage: https://docs.microsoft.com/zh-cn/windows/console/using-the-high-level-input-and-output-functions
属性值: https://docs.microsoft.com/zh-cn/windows/console/console-screen-buffers#character-attributes

SetConsoleTextAttribute函数用于设置显示后续写入文本的颜色。在退出之前,程序会还原原始控制台输入模式和颜色属性。但是微软官方建议使用“虚拟终端”来实现终端控制,而且是跨平台的。

建议使用基于windows提供的“虚拟终端序列”来实现兼容多平台的终端控制,比如:https://github.com/gookit/color
https://docs.microsoft.com/zh-cn/windows/console/console-virtual-terminal-sequences
https://docs.microsoft.com/zh-cn/windows/console/console-virtual-terminal-sequences#samples

2、关于如何设置前景色和背景色

背景色 | 前景色
注意,简单的或操作是错误的,比如 4 | 2,实际是 6 即 黄色,和预期的红底绿字不一致。
应该构成1个8位的二进制,前四位是背景色,后四位是前景色,因此背景色需要左移4位。

当然这些都已经封装在ColorOutput里面了,不需要操心。

最后推荐一个很好的颜色包:https://github.com/gookit/color,使用的虚拟终端序列来实现的,功能强大,兼容性好。

二、单个进度条效果

单个进度条的原理很简单,在for循环中,每输出一次后使用\r使光标回到当前行的开头,如果每次输出内容的长度不一样的话,还需要清除此行(在下面讲到)。

三、多行刷新

比如我们在linux系统下使用 top 命令的效果。

主要的输出控制指令

\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \033[37m 设置前景色
\033[40m — \033[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏,其实是翻页,滚动鼠标还能看到上一页的输出
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

我们会用到光标的上移和下移清除从光标到行尾的内容

\033[nA 光标上移n行,这个n值就是上一次输出的行数,我们要把光标移到起始行,这个指令只需要做一次,然后在输出每一行之前先使用\033[K指令清理当前行,因为每一此输出时某一行的内容长度是不一样的,如果这一次的长度没有上一次长,那么还能看到上一次的残留信息。

func ff() {
	fmt.Println("aaa\nbbb\nccc")

	t := 1
	for {
		if t == 0 {
			fmt.Println("\033[3A\033[Kaaa\n\033[Kbbb\n\033[Kccc")
			t++
		} else {
			fmt.Println("\033[3A\033[K11111\n\033[K222222222\n\033[K333")
			t--
		}

		time.Sleep(3 * time.Second)
	}
}

效果就是后面的替换掉前面的输出。

封装一下

func RefreshTable(data string) string {
	lines := strings.Split(data, "\n")
	num := strconv.Itoa(len(lines))
	for k, line := range lines {
		lines[k] = "\033[K" + line
	}

	lines[0] = "\033[" + num + "A" + lines[0]
	dst := strings.Join(lines, "\n")
	return dst
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/103433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人大金仓三大兼容:MySQL迁移无忧

近日,MySQL 5.7停服事件引发广泛关注。MySQL目前已经成为中国用户使用非常广泛的数据库,其中5.7版本的用户比重又是最高的。随着信息技术应用创新深入各行各业,国产数据库对MySQL的平滑替换成为大势所趋。 作为数据库领域国家队,人…

记一次大型微服务项目本地打包迁移部署

记一次大型微服务项目本地打包迁移部署 引代码合并发布过程本地部署服务配置服务打包自启动测试外部依赖排除部分外部依赖 引 服务的运维也是一个挺复杂工作,如项目上线后的一次小版本发布,开发人员需要基于工程最新代码拉取feature分支,本地…

echarts-进度条

echarts-进度条 option {title: {text:"xxxx统计",left: 1%,top: 0%,textStyle: {color: "#2E3033",fontSize:18,},},tooltip: {axisPointer: {type: "shadow",},},grid: {top: 9%,left: "12%",right:"22%",bottom:"0…

基于springboot实现企业客户信息反馈平台管理系统项目【项目源码+论文说明】

基于springboot实现企业客户信息反馈平台管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把企业客户信息反馈管理与现在网络相结合,利用java技术建设企业客户信息反馈平台,实现企业客户信息反馈的信息化。则对于进一步提高企业客户信息反…

6.6 Elasticsearch(六)京淘项目改造

文章目录 1.项目准备2.基础配置2.1 添加pom.xml依赖2.2 yml配置es服务器地址列表 3.具体实现3.1 item实体类封装3.2 添加接口3.3 SearchController 4.search.jsp界面4.1 搜索内容展示4.2 高亮内容样式设置4.3 搜索框内容回填4.4 添加上下页按钮 1.项目准备 我们切换回到此前的…

基于ElasticSearch+Vue实现简易搜索

基于ElasticSearchVue实现简易搜索 一、模拟数据 产品名称描述价格库存数量品牌名称智能手表智能手表,具有健康跟踪和通知功能。199.991000TechWatch4K智能电视4K分辨率智能电视,提供出色的画质。699.99500VisionTech无线耳机降噪无线耳机,…

ChineseChess2

中国象棋:黑将,红帅双炮,只要红帅中间露头怎么走怎么赢 卡主黑将的走位,控制住就好了 ChineseChess-CSDN博客

17 结构型模式-享元模式

1 享元模式介绍 2 享元模式原理 3 享元模式实现 抽象享元类可以是一个接口也可以是一个抽象类,作为所有享元类的公共父类, 主要作用是提高系统的可扩展性. //* 抽象享元类 public abstract class Flyweight {public abstract void operation(String extrinsicState); }具体享…

2023了,是时候使用pnpm了!

2023了,是时候使用pnpm了! Excerpt 2023了,是时候使用pnpm了! 什么是pnpm pnpm代表performant npm(高性能的npm),同npm和Yarn,都属于Javascript包管理安装工具,它较npm和…

智慧垃圾站:AI视频智能识别技术助力智慧环保项目,以“智”替人强监管

一、背景分析 建设“技术先进、架构合理、开放智能、安全可靠”的智慧环保平台,整合环境相关的数据,对接已建业务系统,将环境相关数据进行统一管理,结合GIS技术进行监测、监控信息的展现和挖掘分析,实现业务数据的快速…

php 数组基础/练习

数组 练习在最后 数组概述 概述与定义 数组中存储键值对 数组实际上是一个有序映射 key-value,可将其当成真正的数组、列表(向量)、散列表、字典、集合、栈、队列等 数组中的元素可以是任意类型的数据对象(可以嵌套数组&#…

视频号视频提取工具,操作简单!一键搞定

在当下信息爆炸的时代,视频成为了人们获取信息、娱乐和交流的重要方式。而随着视频创作的普及,越来越多的人希望能够从各类视频中提取出有价值的素材和片段,以便用于自己的创作需求。然而,对于大多数人来说,费时费力地…

模拟线程死锁现象:两个线程同时抢两个互斥锁

下面业务逻辑的分析 1.如果 flag 为 T,线程 A 就会先得到 / 持有 o1 对象锁,然后尝试去获取 o2 对象锁 2.如果线程 A 得不到 o2 对象锁,就会 Blocked 3.如果 flag 为 F ,线程 B 就会先得到 / 持有 o2 对象锁,然后尝试去…

Mac M1下使用Colima替代docker desktop搭建云原生环境

文章目录 为什么不使用docker desktop1.docker desktop卸载2.docker、docker compose安装3.colima安装3.1获取镜像地址3.2将下载好的iso文件放到colima指定路径3.3重新执行colima start 4.minikukekubernetes安装5.关闭minikube Mac M1下使用Colima替代docker desktop搭建云原生…

SOFAStack软件供应链安全产品解析——SCA软件成分分析

近年来,软件供应链安全相关攻击事件呈快速增长态势,造成的危害也越来越严重,为了保障软件供应链安全,各行业主管单位也出台了诸多政策及技术标准。基于内部多年的实践,蚂蚁数科金融级云原生PaaS平台SOFAStack发布完整的…

保护云数据安全的关键环节是什么?

云数据安全是维护数据隐私和保护关键信息的关键一环。在云中存储和处理数据提供了巨大的便利性和效率,但同时也伴随着风险。本文将介绍保护云数据的关键环节是什么! 1、数据加密:在传输和存储数据时使用强加密是保护数据的基本步骤。确保数据在云中存储时…

Iterator迭代器

一、基本概念 Iterator迭代器是一种接口,为不同的数据结构提供一种访问机制,即for … of 循环。当使用for…of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。任何数据结构只要部署Iterator接口,就可以完成遍历操作(…

SpringBoot中对Spring AOP的实现

文章目录 SpringBoot中对Spring AOP的实现AOP简介引入依赖AOP体系与概念编写AOP切面类启动SpringBoot项目然后访问controller控制器对环绕通知放行execution表达式的含义通过注解方式定义切点 SpringBoot中对Spring AOP的实现 AOP简介 AOP (Aspect Oriented Programming), 面…

智能视频监控平台EasyCVR接口调用注意事项汇总!

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

前端,CSS,背景颜色跟随轮播图片改变而改变(附源码)

首先看效果! 比如轮播图时红色,那么背景的底色也是红色,轮播图时黄色,背景的底色也是黄色,这就是根据轮播图的图片切换,而改变背景颜色随轮播图颜色一致 话不多说,直接上代码!非常简…