GO语言开发终端命令行小工具改进更新

 更新时间:2024年01月08日 14:35:18   作者:南丞 PFinalClub  
这篇文章主要为大家介绍了GO语言开发终端命令行小工具的改进更新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

前面有一篇文章记录了使用 Go 的 cobra/cobra 库来开发 终端的小工具 

GO语言开发终端小工具轻松上手!

在前面的基础上又更新了一些小的工具.内容如下:

   - pf_tools pf_wt 查询天气
   - pf_tools pf_m 手机归属地查询
   - pf_tools pf_md5 md5 小工具
   - pf_tools pf_b64 base64 小工具
   - pf_tools pf_s 查询网络词汇
   - pf_tools pf_t  获取当前时间戳

其中 「pf_wt」「pf_s」 使用了 网络的接口.其他的都是没有使用网络的接口.在更新迭代的过程中,遇到嘞些问题,这里记录一下.

显示与复制的问题

1. 复制问题

在开发 「pf_b64」,「pf_t」,「pf_md5」 的时候, 显示都没啥问题, 但是在使用的过程中发现, 由于使用了 「termui」 终端 UI 库导致复制的时候, 复制的内容是乱的。于是做了如下修改:

 uiEvents := ui.PollEvents()
	for {
		e := <-uiEvents
		switch e.ID {
		case "q":
			return
		case "c":
			_ = clipboard.WriteAll(enStr)
			return
		}
	}

使用了「github.com/atotto/clipboard」库, 增加了 按键 「c」 的时候, 直接复制到 剪贴板。这样就方便多了。

2. 显示问题

「pf_b64」 终端显示的时候,由于前期测试的是比较短的内容, 后来加入比较长的内容的时候 导致显示的内容被截断, 于是做了如下修改:

  func splitStringByLength(s string, length int) []string {
	var result []string
	for i := 0; i < len(s); i += length {
		if i+length > len(s) {
			result = append(result, s[i:])
		} else {
			result = append(result, s[i:i+length])
		}
	}
	return result
}
    sEncList := splitStringByLength(sprintf, 100)
	// fmt.Println(strings.Join(sEncList, "\n"))
	p := widgets.NewParagraph()
	p.Title = "加密结果"
	p.Text = strings.Join(sEncList, "\n")
	// p.Text = sprintf
	p.TextStyle.Fg = ui.ColorGreen
	p.TextStyle.Modifier = ui.ModifierBold
	p.BorderStyle.Fg = ui.ColorGreen
	p.WrapText = true
	p.SetRect(0, 0, 105, len(sEncList)+2)

对 结果 的长度进行了动态计算, 然后进行了动态的显示,出来的效果就是可以换行显示了,效果如下:

注意: 这里按 c 复制

打包问题

在 「go build」 以后丢到 linux 系统上 发现 无法运行, 因为 在 开发 「pf_m」 命令的时候使用了,第三方的库 「github.com/zheng-ji/gophone」, 这个库中有一个 「.dat」的静态文件, 在 「go build」 以后没有打包进程序中去, 于是 开启 google 大法, 发现还是没有啥好的解决办法.

最后, 翻了翻 「github.com/zheng-ji/gophone」 这个包中的源码, 发现代码不多, 直接复制过来, 然后吧 「.bat」 的数据库文件也复制过来, 然后去「go build」 发现还是没有打包进去, 于是 继续 google 大法, 最后修改了一下 包含文件的代码:

// 修改前
func init() {
	_, fulleFilename, _, _ := runtime.Caller(0)
	var err error
	content, err = ioutil.ReadFile(path.Join(path.Dir(fulleFilename), PHONE_DAT))
	if err != nil {
		panic(err)
	}
}
// 修改后
//go:embed phone.dat
var fsContent embed.FS
func init() {
	var err error
	content, err = fsContent.ReadFile(PhoneDat)
	if err != nil {
		panic(err)
	}
}

使用了 「embed」 来进行导入. 然后顺利打包,在 linux 系统上 运行正常.

「上面这种 复制代码的解决办法,估计是个大坑,等后续看到解决办法,再来更新记录」

Windows 显示问题

由于解决了运行的问题, 以为万事大吉了 但是在 windows 系统上 发现 显示有问题 如下:

搜索发现 「termui」 在 windows 下不支持中文, 所以只能 放弃 win了

最后

小工具持续更新,更多关于GO开发终端命令行工具的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言dolphinscheduler任务调度处理

    Go语言dolphinscheduler任务调度处理

    这篇文章主要为大家介绍了Go语言dolphinscheduler任务调度处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go 实现 WebSockets之创建 WebSockets

    Go 实现 WebSockets之创建 WebSockets

    这篇文章主要介绍了Go 实现 WebSockets之创建 WebSockets,文章主要探索 WebSockets,并简要介绍了它们的工作原理,并仔细研究了全双工通信,想了解更多相关内容的小伙伴可以参考一下
    2022-04-04
  • Go语言中字符串四种拼接方式的性能对比

    Go语言中字符串四种拼接方式的性能对比

    在go语言中,字符串是不可变的,因此字符串之间的拼接实际上是创建了一个新的字符串,如果频繁操作会对性能产生严重的影响,下面我们来看看Go语言中字符串四种常见拼接方式的性能对比吧
    2025-04-04
  • Golang如何构造最佳随机密码详解

    Golang如何构造最佳随机密码详解

    人们往往有使用同一密码的习惯,为了防止数据库意外泄露/破坏和出于保护用户隐私的目的,下面这篇文章主要给大家介绍了关于Golang如何构造最佳随机密码的相关资料,需要的朋友可以参考下
    2023-01-01
  • 手把手教你导入Go语言第三方库

    手把手教你导入Go语言第三方库

    本文主要介绍了手把手教你导入Go语言第三方库,通过导入gin包来深入学习,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Go语言切片(Slice)使用技巧与避坑指南

    Go语言切片(Slice)使用技巧与避坑指南

    切片(Slice)是Go语言中最灵活且高频使用的数据结构之一,其本质是对底层数组的动态引用视图,支持动态扩容、高效截取等特性,本文将结合代码示例,详细解析切片的核心用法及常见注意事项,需要的朋友可以参考下
    2025-06-06
  • golang使用通道时需要注意的一些问题

    golang使用通道时需要注意的一些问题

    本文主要介绍了golang使用通道时需要注意的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Go中crypto/rsa库的高效使用指南

    Go中crypto/rsa库的高效使用指南

    本文主要介绍了Go中crypto/rsa库的高效使用指南,从 RSA 的基本原理到 crypto/rsa 库的实际应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Go实现SSE消息推送的项目实战

    Go实现SSE消息推送的项目实战

    本文主要介绍了Go实现SSE消息推送的项目实战,结合JavaScript前端集成,构建实时数据推送系统,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 详解Go strconv包

    详解Go strconv包

    Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换。这篇文章主要介绍了Go strconv包的相关知识,需要的朋友可以参考下
    2020-10-10

最新评论