👏 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
可得以下结果:
解析二维码
思路:
- 上传图片或者本地读取图片
- 将文件流写入到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,