Golang 基础案例集合:中文拼音转换、解析二维码、压缩 zip、执行定时任务

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 曾经,因为不够注重基础吃了好多亏。总是很喜欢去看那些高大上的东西,却忽略了最基本的东西。然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解。我觉得,可

👏 Hi! 我是 Yumuing,一个技术的敲钟人

👨‍💻 每天分享技术文章,永远做技术的朝拜者

📚 欢迎关注我的博客:Yumuing's blog

前言

曾经,因为不够注重基础吃了好多亏。总是很喜欢去看那些高大上的东西,却忽略了最基本的东西。然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解。我觉得,可能这就是大部分开发工程师的通病吧。

所以,深入一门语言,也不用一直看重多高端、高大上的框架功能服务,尝试一下小案例,拓宽一下对于语言的更深层次的理解。

@[toc]

基础案例

  • 中文拼音转换:根据用户名快速创建个人 id
  • 解析二维码:帮助快速识别硬件码
  • 压缩 zip:压缩文件,便于传输数据
  • 执行定时任务:方便自动化操作

中文拼音转换

package main

import (
    "fmt"
    "github.com/mozillazg/go-pinyin"
)

func main() {
   
   
    hans := "中国人"

    // 默认
    a := pinyin.NewArgs()
    fmt.Println(pinyin.Pinyin(hans, a))
    // [[zhong] [guo] [ren]]

    // 包含声调
    a.Style = pinyin.Tone
    fmt.Println(pinyin.Pinyin(hans, a))
    // [[zhōng] [guó] [rén]]

    // 声调用数字表示
    a.Style = pinyin.Tone2
    fmt.Println(pinyin.Pinyin(hans, a))
    // [[zho1ng] [guo2] [re2n]]

    // 开启多音字模式
    a = pinyin.NewArgs()
    a.Heteronym = true
    fmt.Println(pinyin.Pinyin(hans, a))
    // [[zhong zhong] [guo] [ren]]
    a.Style = pinyin.Tone2
    fmt.Println(pinyin.Pinyin(hans, a))
    // [[zho1ng zho4ng] [guo2] [re2n]]

    fmt.Println(pinyin.LazyPinyin(hans, pinyin.NewArgs()))
    // [zhong guo ren]

    fmt.Println(pinyin.Convert(hans, nil))
    // [[zhong] [guo] [ren]]

    fmt.Println(pinyin.LazyConvert(hans, nil))
    // [zhong guo ren]
}

实际应用过程中,只要能够获取需要转换的中文词语字符串数组即可实现中文拼音转换的操作,不过,虽然使用的包 github.com/Chain-Zhang/pinyin 相对于其他 golang 拼音转换项目的资料多一点,但貌似不维护了。

package main

import (
    "fmt"
    "github.com/mozillazg/go-pinyin"
    "strings"
    "reflect"
    "github.com/astaxie/beego"
)

func main() {
   
   
    hans := "中国人"

    a := pinyin.LazyConvert(hans, nil)
    // [zhong guo ren]

    var test []string = []string{
   
   }
    for a, v := range a{
   
   
        beego.Info(v)
        beego.Info(a)
        if a == 0 {
   
   
            test = append(test, v)
        } else {
   
   
            test = append(test, ",")
            test = append(test, v)
        }

    }
        beego.Info("处理1")
    beego.Info(test)

//  通过这一条处理 strings.Trim
    result := strings.Trim(fmt.Sprint(test), "[]")
    // result := strings.Replace(strings.Trim(fmt.Sprint(test), "[]"), " ", ",", -1)
    beego.Info(result)
    beego.Info(reflect.TypeOf(result))

result2 := strings.Replace(result, " , ", "", -1)
       beego.Info(result2)
    // zhongguoren
}

运行代码如下:

go get -u github.com/mozillazg/go-pinyin
go run main.go

可得以下结果:
中文转拼音结果

解析二维码

思路:

  1. 上传图片或者本地读取图片
  2. 将文件流写入到gozxing 的函数中解析二维码
    这里采用上传文件的形式,如下:

```go
package main

import (
"fmt"
"image"
"image/gif" "image/jpeg"
_ "image/png"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/qrcode"
"github.com/gin-gonic/gin"
"net/http"
"io"
)

func main() {
router := gin.Default()
router.POST("/upload", func(c *gin.Context) {
// The default memory allocation is 10M
file, err := c.FormFile("filename")
if err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
return
}

    //文件大小限制
    if file.Size > (10 << 20) {
        c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", "文件太大,请重新上传"))
        return
    }

    c.String(http.StatusOK, fmt.Sprintf("File %s uploaded success", file.Filename))
    //fmt.Println(file.Filename, "文件名")
    fi, err := file.Open()
    if err != nil {
        fmt.Println(err)
    }
    defer fi.Close()

    str := GetPaymentStr(fi).String()
    fmt.Println("qrcode_url:", str)
})
router.Run(":8000")

}

func GetPaymentStr(fi io.Reader) (paymentCodeUrl *gozxing.Result) {
img, _, err := image.Decode(fi)
if err != nil {
fmt.Println(err)
}
// prepare BinaryBitmap
bmp,

目录
相关文章
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
3月前
|
Go
Golang生成随机数案例实战
关于如何使用Go语言生成随机数的三个案例教程。
205 91
Golang生成随机数案例实战
|
1月前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
33 0
|
3月前
|
Go
Golang的time.NewTimer单次定时器使用案例
这篇文章介绍了Go语言中time包的多种定时器使用案例,包括单次定时器的创建、阻塞程序运行的Sleep函数、重置和停止定时器的方法,以及After和AfterFunc函数的使用。
59 5
Golang的time.NewTimer单次定时器使用案例
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
79 3
Golang语言之Prometheus的日志模块使用案例
|
3月前
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
33 2
|
3月前
|
Go
Golang语言数据类型分类及进制转换案例
这篇文章详细介绍了Go语言中数据类型的分类、进制转换的概念和实例,以及数字字面量语法,还涉及了原码、反码和补码的相关知识。
26 0
Golang语言数据类型分类及进制转换案例
|
3月前
|
Go
Golang的time.NewTicker周期性定时器使用案例
这篇文章介绍了Golang中time包的NewTicker函数如何创建周期性定时器,并通过两个示例展示了如何使用定时器以及如何停止定时器。
79 1
|
4月前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。