当前位置: 首页 > news >正文

【Go】用Go在命令行输出好看的表格

用Go在命令行输出好看的表格

  • 前言
  • 正文
    • 生成Table
    • 表头设置
    • 插入行
    • 表格标题
    • 自动标号
    • 单元格合并
      • 列合并
      • 行合并
    • 样式设置
      • 居中设置
      • 数字自动高亮标红
    • 完整Demo代码
  • 结语

前言

最近在写一些运维小工具,比如批量进行ping包的工具,实现不困难,反正就是ping,统计,然后输出,不过我本着自己既是开发者又是使用者的理念,还是不喜欢输出特别难看的工具,就像这样:

在这里插入图片描述
所以就去https://pkg.go.dev/瞄了一眼,看看有没有啥适合的库能够把输出整的好看点的,于是找到了一个库github.com/jedib0t/go-pretty/v6/table,这是一个在命令行输出格式化表格的库,这里记录一下使用这个库进行一些格式化输出的过程。

其实还有一个比较简单的库叫做gotable,也能实现基础的格式化输出功能,使用起来也方便些,不过功能相对来说就要单一一些,在表格样式设置上会差一些,没那么自由,也可以看下https://pkg.go.dev/github.com/liushuochen/gotable#section-readme

正文

接下来开始正式的去在命令行生成好看的满足需要的表格。

生成Table

首先我们要生成一个Table结构体的实例,可以直接New一个,也可以自己构造:

t := table.Table{}
// 或者
t := table.NewWriter()

NewWriter会返回一个Writer接口

表头设置

表格首先要设置表头,以我的应用为例,表头设置:

header := table.Row{"ID", "IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}

这样生成了一个表头行,然后要通过AppendHeader方法在表格中生效:

t.AppendHeader(header)

看看效果,表头已经打印出来了

+----+----+-----+-------------+------------+--------+
| ID | IP | NUM | PACKETSRECV | PACKETLOSS | AVGRTT |
+----+----+-----+-------------+------------+--------+
+----+----+-----+-------------+------------+--------+

插入行

数据的插入和表头的生成类似,要生成一个table.Row,然后调用AppendRow方法:

func (d *Demo) AppendRow() {for i := 1; i <= 5; i++ {row := table.Row{i, fmt.Sprintf("10.0.0.%v", i), i + 4, i, i, "AppendRow"}d.T.AppendRow(row)}
}

效果如下:

+----+----------+-----+-------------+------------+-----------+
| ID | IP       | NUM | PACKETSRECV | PACKETLOSS | AVGRTT    |
+----+----------+-----+-------------+------------+-----------+
|  1 | 10.0.0.1 |   5 |           1 |          1 | AppendRow |
|  2 | 10.0.0.2 |   6 |           2 |          2 | AppendRow |
|  3 | 10.0.0.3 |   7 |           3 |          3 | AppendRow |
|  4 | 10.0.0.4 |   8 |           4 |          4 | AppendRow |
|  5 | 10.0.0.5 |   9 |           5 |          5 | AppendRow |
+----+----------+-----+-------------+------------+-----------+

当然也可以生成table.Row的切片后调用一次AppendRows方法,效果和上面是一样的:

func (d *Demo) AppendRows() {var rows []table.Rowfor i := 1; i <= 5; i++ {rows = append(rows, table.Row{i, fmt.Sprintf("10.0.0.%v", i), i + 4, i, i, "AppendRows"})}d.T.AppendRows(rows)
}
+----+----------+-----+-------------+------------+------------+
| ID | IP       | NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+----+----------+-----+-------------+------------+------------+
|  1 | 10.0.0.1 |   5 |           1 |          1 | AppendRow  |
|  2 | 10.0.0.2 |   6 |           2 |          2 | AppendRow  |
|  3 | 10.0.0.3 |   7 |           3 |          3 | AppendRow  |
|  4 | 10.0.0.4 |   8 |           4 |          4 | AppendRow  |
|  5 | 10.0.0.5 |   9 |           5 |          5 | AppendRow  |
|  1 | 10.0.0.1 |   5 |           1 |          1 | AppendRows |
|  2 | 10.0.0.2 |   6 |           2 |          2 | AppendRows |
|  3 | 10.0.0.3 |   7 |           3 |          3 | AppendRows |
|  4 | 10.0.0.4 |   8 |           4 |          4 | AppendRows |
|  5 | 10.0.0.5 |   9 |           5 |          5 | AppendRows |
+----+----------+-----+-------------+------------+------------+

表格标题

在设置表格实际内容时,还可以设置一个表格标题,如下:

func (d *Demo) AddTitle() {d.T.SetTitle("This is Easy Table")
}
+-------------------------------------------------------------+
| This is Easy Table                                          |
+----+----------+-----+-------------+------------+------------+
| ID | IP       | NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+----+----------+-----+-------------+------------+------------+
|  1 | 10.0.0.1 |   5 |           1 |          1 | AppendRow  |
|  2 | 10.0.0.2 |   6 |           2 |          2 | AppendRow  |
|  1 | 10.0.0.1 |   5 |           1 |          1 | AppendRows |
|  2 | 10.0.0.2 |   6 |           2 |          2 | AppendRows |
+----+----------+-----+-------------+------------+------------+

自动标号

在插入行的时候,我额外输入了一个ID列,作为标号,其实table提供了相关的方法和接口,只需要调用SetAutoIndex方法,增加自动的索引列即可:

func (d *Demo) MakeHeader() {header := table.Row{"IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}d.T.AppendHeader(header)d.T.SetAutoIndex(true)
}
+------------------------------------------------------------+
| This is Easy Table                                         |
+---+----------+-----+-------------+------------+------------+
|   | IP       | NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+---+----------+-----+-------------+------------+------------+
| 1 | 10.0.0.1 |   5 |           1 |          1 | AppendRow  |
| 2 | 10.0.0.2 |   6 |           2 |          2 | AppendRow  |
| 3 | 10.0.0.1 |   5 |           1 |          1 | AppendRows |
| 4 | 10.0.0.2 |   6 |           2 |          2 | AppendRows |
+---+----------+-----+-------------+------------+------------+

单元格合并

有的时候,相邻单元格的值一样我们可能会想要进行合并,这样更美观,单元格合并分为列合并和行合并;先定义一下这里的列合并和行合并:

  • 列合并:针对单列,如果单列中的多个相邻行数据一样,那么就合并为一个大行;
  • 行合并:针对单行,如果单行中的多个相邻列数据一样,那么久合并为一个大列;

这里我们用到的原始表格如下:

+--------------------------------------------------------------+
| This is Easy Table                                           |
+---+----------+-------+-------------+------------+------------+
|   | IP       |   NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+---+----------+-------+-------------+------------+------------+
| 1 | 10.0.0.1 |     5 |           1 |          1 | AppendRow  |
| 2 | 10.0.0.2 |     6 |           2 |          2 | AppendRow  |
| 3 | 10.0.0.1 |     5 |           1 |          1 | AppendRows |
| 4 | 10.0.0.2 |     6 |           2 |          2 | AppendRows |
+---+----------+-------+-------------+------------+------------+
|   | TOTAL    | TOTAL |       TOTAL |      TOTAL | 4          |
+---+----------+-------+-------------+------------+------------+

列合并

我们先进行最后一列AvgRtt的列合并:

func (d *Demo) ColumnMerge() {d.T.SetColumnConfigs([]table.ColumnConfig{{Name: "AvgRtt",// Number是指定列的序号// Number: 5,AutoMerge: true,Align:     text.AlignCenter,},})
}

可以选择通过列的表头或者列的序号来选择具体进行合并的列:

+---+----------+-------+-------------+------------+------------+
|   | IP       |   NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+---+----------+-------+-------------+------------+------------+
| 1 | 10.0.0.1 |     5 |           1 |          1 |  AppendRow |
| 2 | 10.0.0.2 |     6 |           2 |          2 |            |
| 3 | 10.0.0.1 |     5 |           1 |          1 | AppendRows |
| 4 | 10.0.0.2 |     6 |           2 |          2 |            |
+---+----------+-------+-------------+------------+------------+
|   | TOTAL    | TOTAL |       TOTAL |      TOTAL | 4          |
+---+----------+-------+-------------+------------+------------+

这样看表格线条不明显,感觉不到区分,那么可以加上一些设置d.T.Style().Options.SeparateRows = true

+---+----------+-------+-------------+------------+------------+
|   | IP       |   NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+---+----------+-------+-------------+------------+------------+
| 1 | 10.0.0.1 |     5 |           1 |          1 |  AppendRow |
+---+----------+-------+-------------+------------+            |
| 2 | 10.0.0.2 |     6 |           2 |          2 |            |
+---+----------+-------+-------------+------------+------------+
| 3 | 10.0.0.1 |     5 |           1 |          1 | AppendRows |
+---+----------+-------+-------------+------------+            |
| 4 | 10.0.0.2 |     6 |           2 |          2 |            |
+---+----------+-------+-------------+------------+------------+
|   | TOTAL    | TOTAL |       TOTAL |      TOTAL | 4          |
+---+----------+-------+-------------+------------+------------+

行合并

行合并我们对最后一行的汇总行进行合并,具体做法是在添加汇总行时增加RowConfig参数:

func (d *Demo) AppendFooter() {d.T.AppendFooter(table.Row{"Total", "Total", "Total", "Total", count}, table.RowConfig{AutoMerge: true})
}
+---+----------+-------+-------------+------------+------------+
|   | IP       |   NUM | PACKETSRECV | PACKETLOSS | AVGRTT     |
+---+----------+-------+-------------+------------+------------+
| 1 | 10.0.0.1 |     5 |           1 |          1 |  AppendRow |
+---+----------+-------+-------------+------------+            |
| 2 | 10.0.0.2 |     6 |           2 |          2 |            |
+---+----------+-------+-------------+------------+------------+
| 3 | 10.0.0.1 |     5 |           1 |          1 | AppendRows |
+---+----------+-------+-------------+------------+            |
| 4 | 10.0.0.2 |     6 |           2 |          2 |            |
+---+----------+-------+-------------+------------+------------+
|   |                    TOTAL                    | 4          |
+---+---------------------------------------------+------------+

样式设置

现在整个表格已经生成,但我们还需要进行一些美化,这就要对表格的样式进行设置了;

居中设置

对于居中,无法直接进行全局的设置,必须根据列进行,如下:

func (d *Demo) SetAlignCenter() {column := []string{"IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}c := []table.ColumnConfig{}// 根据表格的列数循环进行设置,统一居中for i := 1; i <= len(column); i++ {name := column[i-1]if name == "AvgRtt" {c = append(c, table.ColumnConfig{Name:        "AvgRtt",AutoMerge:   true,Align:       text.AlignCenter,AlignHeader: text.AlignCenter,AlignFooter: text.AlignCenter,})continue}c = append(c, table.ColumnConfig{Name:        column[i],Align:       text.AlignCenter,AlignHeader: text.AlignCenter,AlignFooter: text.AlignCenter,})}d.T.SetColumnConfigs(c)
}

居中效果如下,这样既能保留列合并又完成了剧中设置:

+---+----------+-------+-------------+------------+------------+
|   | IP       |  NUM  | PACKETSRECV | PACKETLOSS |   AVGRTT   |
+---+----------+-------+-------------+------------+------------+
| 1 | 10.0.0.1 |   5   |      1      |      1     |  AppendRow |
+---+----------+-------+-------------+------------+            |
| 2 | 10.0.0.2 |   6   |      2      |      2     |            |
+---+----------+-------+-------------+------------+------------+
| 3 | 10.0.0.1 |   5   |      1      |      1     | AppendRows |
+---+----------+-------+-------------+------------+            |
| 4 | 10.0.0.2 |   6   |      2      |      2     |            |
+---+----------+-------+-------------+------------+------------+
|   |                    TOTAL                    |      4     |
+---+---------------------------------------------+------------+

数字自动高亮标红

在我的应用场景中,ping的ip如果出现了丢包情况,那就要红色高亮,方便使用者马上关注到,这种情况下,可以通过Transformer来设置:

func (d *Demo) SetWarnColor() {// 字体颜色WarnColor := text.Colors{text.BgRed}warnTransformer := text.Transformer(func(val interface{}) string {if val.(float64) > 0 {// 统计丢包服务器总数return WarnColor.Sprintf("%.2f%%", val)}return fmt.Sprintf("%v%%", val)})d.T.SetColumnConfigs([]table.ColumnConfig{{Name:        "PacketLoss",AutoMerge:   true,Align:       text.AlignCenter,AlignHeader: text.AlignCenter,AlignFooter: text.AlignCenter,Transformer: warnTransformer,},})
}

实际效果如下:
在这里插入图片描述

完整Demo代码

package mainimport ("fmt""math/rand""github.com/jedib0t/go-pretty/v6/table""github.com/jedib0t/go-pretty/v6/text"
)var count = 0type Demo struct {T table.Writer
}func NewDemo() *Demo {return &Demo{T: table.NewWriter(),}
}func (d *Demo) MakeHeader() {header := table.Row{"IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}d.T.AppendHeader(header)d.T.SetAutoIndex(true)// d.T.SetStyle(table.StyleLight)d.T.Style().Options.SeparateRows = true
}func (d *Demo) AddTitle() {d.T.SetTitle("This is Easy Table")
}func (d *Demo) AppendRow() {// rowConfig := table.RowConfig{AutoMerge: true}for i := 1; i <= 2; i++ {row := table.Row{fmt.Sprintf("10.0.0.%v", i), i + 4, i, rand.Float64() * 100, "AppendRow"}count += 1d.T.AppendRow(row)}d.T.AppendRow(table.Row{fmt.Sprintf("10.0.0.%v", 4), 1 + 4, 1, 0.0, "AppendRow"})
}func (d *Demo) AppendRows() {var rows []table.Rowfor i := 1; i <= 2; i++ {rows = append(rows, table.Row{fmt.Sprintf("10.0.0.%v", i), i + 4, i, rand.Float64() * 100, "AppendRows"})count += 1}d.T.AppendRows(rows)
}func (d *Demo) AppendFooter() {d.T.AppendFooter(table.Row{"Total", "Total", "Total", "Total", count}, table.RowConfig{AutoMerge: true, AutoMergeAlign: text.AlignCenter})
}func (d *Demo) ColumnMerge() {d.T.SetColumnConfigs([]table.ColumnConfig{{Name: "AvgRtt",// Number是指定列的序号// Number: 5,AutoMerge: true,Align:     text.AlignCenter,},})
}func (d *Demo) SetAlignCenter() {column := []string{"IP", "Num", "PacketsRecv", "PacketLoss", "AvgRtt"}c := []table.ColumnConfig{}// 根据表格的列数循环进行设置,统一居中for i := 1; i <= len(column); i++ {name := column[i-1]if name == "AvgRtt" {c = append(c, table.ColumnConfig{Name:        "AvgRtt",AutoMerge:   true,Align:       text.AlignCenter,AlignHeader: text.AlignCenter,AlignFooter: text.AlignCenter,})continue}c = append(c, table.ColumnConfig{Name:        column[i],Align:       text.AlignCenter,AlignHeader: text.AlignCenter,AlignFooter: text.AlignCenter,})}d.T.SetColumnConfigs(c)
}func (d *Demo) SetWarnColor() {// 字体颜色WarnColor := text.Colors{text.BgRed}warnTransformer := text.Transformer(func(val interface{}) string {if val.(float64) > 0 {// 统计丢包服务器总数return WarnColor.Sprintf("%.2f%%", val)}return fmt.Sprintf("%v%%", val)})d.T.SetColumnConfigs([]table.ColumnConfig{{Name:        "PacketLoss",AutoMerge:   true,Align:       text.AlignCenter,AlignHeader: text.AlignCenter,AlignFooter: text.AlignCenter,Transformer: warnTransformer,},})
}func (d *Demo) Print() {fmt.Println(d.T.Render())
}func main() {demo := NewDemo()demo.MakeHeader()// demo.AddTitle()demo.AppendRow()demo.AppendRows()// demo.ColumnMerge()demo.AppendFooter()// demo.SetAlignCenter()demo.SetWarnColor()demo.Print()
}

结语

本文介绍了使用第三方库美化Golang的命令行表格格式化输出,除了table以外,go-pretty库中还包含了进度条、列表等美化方法,感兴趣可以自己看看官方文档。

相关文章:

【Go】用Go在命令行输出好看的表格

用Go在命令行输出好看的表格前言正文生成Table表头设置插入行表格标题自动标号单元格合并列合并行合并样式设置居中设置数字自动高亮标红完整Demo代码结语前言 最近在写一些运维小工具&#xff0c;比如批量进行ping包的工具&#xff0c;实现不困难&#xff0c;反正就是ping&am…...

怎么处理消息重发的问题?

消息队列在消息传递的过程中&#xff0c;如果出现传递失败的情况&#xff0c;发送方会重试&#xff0c;在重试的过程中&#xff0c;可能会产生重复的消息。 消息重复的情况必然存在 关于传递消息时能够提供的服务质量标准&#xff0c;MQTT协议给出了三种不同的标准&#xff1…...

JVM 运行时数据区(数据区组成表述,程序计数器,java虚拟机栈,本地方法栈)

JVM 运行时数据区JVM 运行时数据区3.1运行时的数据区组成概述3.1.1程度计数器3.1.2java虚拟机栈3.1.3本地方法栈3.1.4java堆3.1.5方法区3.2程序计数器3.3java虚拟机栈3.4本地方法栈JVM 运行时数据区 堆,方法区(元空间) 主要用来存放数据 是线程共享的. 程序计数器,本地方法栈…...

Oracle ASM磁盘组配置、日常运维、故障处理等操作资料汇总

ASM&#xff08;自动存储管理&#xff09;在数据库中是非常重要的组成部分&#xff0c;它可以为磁盘提供统一的存储管理、提高磁盘访问的性能和可用性、简化管理复杂度&#xff0c;从而为数据库的运行提供更好的支持。这里就为大家整理了墨天轮数据社区上一些ASM相关基础知识、…...

java对象的创建与内存分配机制

文章目录对象的创建与内存分配机制对象的创建类加载检查分配内存初始化零值设置对象头指向init方法其他&#xff1a;指针压缩对象内存分配对象在栈上分配对象在Eden区中分配大对象直接分配到老年代长期存活的对象进入老年代对象动态年龄判断老年代空间分配担保机制对象的内存回…...

本地存储localStorage、sessionStorage

目录 一、localStorage 二、sessionStorage 三、本地存储处理复杂数据 一、localStorage 介绍 &#xff08;1&#xff09;数据存储在用户浏览器中 &#xff08;2&#xff09;设置、读取方便、甚至页面刷新不会丢失数据 &#xff08;3&#xff09;容量较大&#xff0c;se…...

JavaSE: 网络编程

1.1 概述java程序员面对统一的网络编程环境B/S 架构 和 C/S架构1.2 网络通信的两个要素通信双方的地址&#xff1a;ip 端口号网络通信协议&#xff1a;TCP/IP协议&#xff08;事实上的国际规则&#xff09;、OSI模型&#xff08;理想化&#xff09;1.3 Inet Address本地回环地…...

计算机图形学09:二维观察之点的裁剪

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本…...

2023Java 并发编程面试题

Java 并发编程 1、在 java 中守护线程和本地线程区别&#xff1f; java 中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09;。任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法Thread.setDaemon(boolon…...

CAD如何绘制A0/A1/A2/A3/A4图框?

在CAD制图时&#xff0c;设计师一般会使用企业的定制图框模板或者个人的特色图框模板&#xff0c;让设计方案更加标准化、规范化。对于新人设计师而言&#xff0c;完成CAD制图已经非常头疼了&#xff0c;图框的绘制更是手忙脚乱。那么是否有更加高效的方式来完成A0、A1、A2、A3…...

R 安装 “umap-learn“ python 包

首先需要在R中下载并读取reticulate包&#xff0c;该包提供了一系列R-Python的交互式命令由于之前在电脑中通过三个方式安装了Python&#xff1a;直接安装 Python 3.10安装Anaconda&#xff0c;携带3.9安装 Miniconda&#xff0c;又是另外一个版本的Python版本各不相同&#xf…...

测试同学如何快速开发测试平台?

转眼已经好几个月没有发表什么文章了&#xff0c;因为疫情原因&#xff0c;大家工作都不怎么顺利&#xff0c;没有什么心情。再者&#xff0c;最近一直在搞移动端精准测试的项目&#xff0c;有太多技术难点需要攻克。从各个网站上都找不到解决方案&#xff0c;只能不断地尝试&a…...

【程序员接口百宝箱】免费常用API接口

一、短信发送 短信的应用可以说是非常的广泛了&#xff0c;短信API也是当下非常热门的API~ 短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可达&#xff0c;99.99&#xff05;到达率&#xff0c;支持大容量高并发。…...

使数组和能被P整除[同余定理+同余定理变形]

同余定理同余定理变形前言一、使数组和能被P整除二、同余定理变形总结参考资料前言 同余定理非常经典&#xff0c;采用前缀和 map&#xff0c;当两个余数前缀和为一个值时&#xff0c;则中间一段子数组刚好对P整除。但是能否找到前面是否有一段子数组和可以对P整除呐&#xf…...

25k的Java开发常问的Synchronized问题有哪些?

前言:面试高频的Synchronized问题大多集中在应用场景、底层实现原理、锁的升级过程。 文章目录 Synchronized定义应用场景对象加锁实现原理JDK6以前JDK6版本及以后对象从无锁到偏向锁转化的过程(大概讲五分钟)轻量级锁升级的过程(大概讲五分钟)自旋锁策略(大概讲五分钟)…...

ES增量同步方案

1 基于业务代码嵌入式的增量同步方式在Java业务代码要修改业务数据的地方&#xff0c;增加调用写入ES数据的方法优点&#xff1a;1、实现方式简单&#xff0c;可控粒度高&#xff1b;2、不依赖第三方数据同步框架&#xff1b;3、数据库不用做特殊配置和部署&#xff1b;缺点&am…...

计算器--课后程序(Python程序开发案例教程-黑马程序员编著-第6章-课后作业)

实例1&#xff1a;计算器 计算器极大地提高了人们进行数字计算的效率与准确性&#xff0c;无论是超市的收银台&#xff0c;还是集市的小摊位&#xff0c;都能够看到计算器的身影。计算器最基本的功能是四则运算。本实例要求编写程序&#xff0c;实现计算器的四则运算功能。 实…...

YOLOv5中添加SE模块详解——原理+代码

目录一、SENet1. 设计原理2. SE Block2.1 Squeeze:Global Information Embedding2.2 Excitation:Adaptive Recalibration3. SE-Inception and SE-ResNet二、YOLOv5中添加SENet1.修改common.py2.修改yolo.py3.修改yolov5s.yaml参考文章一、SENet 论文地址&#xff1a;Squeeze-a…...

arcgispro3.1(账号登陆)

ArcGIS Pro 3.1 更新中文概览专注于 制图、GIS、Python前言&#xff1a;本次更新给了我两个惊喜&#xff0c;一个是本来 ArcMap 就有的功能&#xff0c;另一个明显是学习的 QGIS&#xff0c;嘿嘿&#xff0c;大家往下看吧。整理翻译了一下官方的 ArcGIS Pro 3.1 新特性更新概览…...

VB6换个思路解决微信下载文件只读的问题(含源码)

日期&#xff1a;2023年3月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

Allegro如何知道组合操作命令的拼写

Allegro如何知道组合操作命令的拼写 前面介绍了如何知道单个操作命令的拼写,但如果是复合命令,就无法直观的通过命令来了解,如下图 Snap Pick to -Segment这个命令拼写是什么 如何知道,具体操作如下 点击File点击Script 出现Scripting窗口...

CDO高效处理气象数据

基础命令&#xff0c;只需要在终端输入命令按enter运行即可 ####### 查看文件信息 cdo infos xxx.nc #显示nc文件中的变量名 cdo showname sst.nc #读文件夹下的数据 for i in $(ls);do echo processing $i ;done #线性插值 cdo remapbil,经度纬度 input.nc output.nc ;done ##…...

1. Qt Designer Studio界面介绍

1. 说明&#xff1a; Qt当中的Qt Quick框架使用QML语言来快速搭建优美的界面&#xff0c;但是对于单纯做界面的设计人员并不是很友好&#xff0c;还要让界面设计人员去消耗时间成本学习QML语法。Qt Designer Studio软件就是为了解决这个问题而设计的&#xff0c;工作人员不需要…...

elementUI+vue_vue-admin-template框架

目录安装版本管理文件mock文件夹---模拟数据permission.js --- 登录权限控制文件安装 克隆项目git clone https://gitee.com/panjiachen/vue-admin-template.git进入项目目录cd vue-element-admin安装依赖npm install启动服务npm run dev版本管理 由于我们之前的项目是直接从…...

SpringBoot项目使用Schedule注释创建定时任务

文章目录知识讲解相关注释&#xff08;主要两个,EnableScheduling和Scheduled&#xff09;scheduled的cron语法代码项目目录结构启动类&#xff08;Application&#xff09;定时任务类(Task)配置类&#xff08;application.properties&#xff09;pom依赖展望&#xff08;Quart…...

学习 Python 之 Pygame 开发魂斗罗(十一)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十一&#xff09;继续编写魂斗罗1. 改写主类函数中的代码顺序2. 修改玩家初始化3. 显示玩家生命值4. 设置玩家碰到敌人死亡5. 设置敌人子弹击中玩家6. 修改updatePlayerPosition()函数逻辑继续编写魂斗罗 在上次的博客学习 Pytho…...

Linux驱动开发

一、驱动分类Linux中包含三大类驱动&#xff1a;字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动&#xff0c;因为字符设备最多&#xff0c;从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…...

32--Vue-前端开发-Vue语法之组件化开发

一、vue语法回顾 购物车的例子 eg1:计算商品价格(掌握对象的迭代方法) <!DOCTYPE html> <html lang="en"> <head>...

打怪升级之CFileDialog类介绍

CFileDialog类 CFileDialog封装用于文件打开操作或文件保存操作的常见对话框。信息来源自Windows官方文档&#xff1a;https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfiledialog-class?viewmsvc-170 这里重点介绍几个常用的函数功能&#xff1a; 构造函数 explic…...

配天智造自主原创数字工厂:百余名员工人均创收122万

配天智造&#xff08;832223&#xff09;2022年度报告显示&#xff0c;报告期内公司实现营业收入1.3亿元&#xff0c;同比增长52%&#xff0c;归属于挂牌公司股东的净利润3867万元&#xff0c;同比增长28.11%。而这家公司全部在职员工仅有107人&#xff0c;人均创收约为122万。…...

网站谷歌优化怎么做/网站关键词seo费用

如果您不介意使用JavaScript和jQuery&#xff0c;则可以使用jQuery client plugin检测操作系统&#xff0c;然后设置字体。它似乎是旧东西&#xff0c;但它适用于jQuery 1.3.2&#xff0c;如果它适用于jQuery 1.6.1&#xff0c;我不会感到惊讶。if($.client.os Mac)$(body).cs…...

王牌网站做代理/高端网站建设定制

1.web应用处理流程 后台接收到请求时&#xff0c;要先经过服务器的解析&#xff0c;然后进行框架处理 2. Web程序框架的意义 用于搭建Web应用程序 免去不同Web应用相同代码部分的重复编写&#xff0c;只需关心Web应用核心的业务逻辑实现 3. Web应用程序的本质 接收并解析HTTP请…...

北仑宁波有没有做网站/友情链接交易网

2019独角兽企业重金招聘Python工程师标准>>> 使用php框架CI进行文件上传处理。出现了You did not select a file to upload.的错误提示。翻了一下CI的源码&#xff0c;定位出来是$_FILES获取不到文件信息。继续定位&#xff0c;得知是上传大小受到php本身的限制&…...

新密网站/互联网品牌宣传推广服务公司

【单选题】首届“挑战杯”中国大学生创业计划大赛是&#xff08; &#xff09;年开始的。 A. 1997 B. 1998 C. 1999 D. 2000 答案&#xff1a;1998 【单选题】“高校毕业生创业行动”是&#xff08; &#xff09;年提出的。 A. 2005 B. 2006 C. 2007 D. 2008 答案&#xff1a;…...

做影视网站用主机还是用服务器/优化生育政策

查看内核和centos版本号 请忽略我的主机名 那个只是第八台虚拟机 ~~ 然后通过rpm 添加yum源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 接着使用 yum -y install nginx 便可以解决依赖关系安装nginx 接着由于ngin…...

网站多久备份一次/百度指数是干嘛的

02号张广旭 13号郭佳鑫 张广旭&#xff1a;代码编写 郭佳鑫&#xff1a;窗体、代码检查 1&#xff0e;概要部分 &#xff08;1&#xff09;代码能符合需求和规格说明么&#xff1f; 基本功能已经实现了&#xff0c;但是还有一些bug &#xff08;2&#xff09;代码设计…...