之前在做一个项目的时候, 遇到了需要用golang做繁简体转换的需求.
经过一番调查, 发现并没有类似用纯golang做的开源项目. 而自己也不想从头写一个(毕竟时间有限, 能力也有限), 于是选择利用python强大的库来做繁简体转换, 然后golang调用即可.

这里面难点有两个:

  1. 如何用python进行繁简体转换
  2. 利用golang调用python封装好的繁简体转换函数

一 如何用Python进行繁简体转换

这个网上也有很多教程:

比如可以利用openccpy进行繁简体转换:
https://blog.51cto.com/9250070/2376916

也可以用zh_wiki.py及langconv进行繁简体转换:
https://blog.csdn.net/thomashtq/article/details/41512359

这里我采用的是后者, 因为比较好实现:
这里做个复读机, copy一下, 方便阅读:

1、下载zh_wiki.py 和 langconv

2、将下载的 langconv.py 和 zh_wiki.py,放在python代码所在目录即可使用

font-convert.py
python2.7Linux
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# font-convert.py 

from langconv import *
 
def simple2tradition(src):
    #将简体转换成繁体
    target= Converter('zh-hant').convert(src.decode('utf-8'))
    target= target.encode('utf-8')
    return target
 
def tradition2simple(src):
    # 将繁体转换成简体
    target= Converter('zh-hans').convert(src.decode('utf-8'))
    target= target.encode('utf-8')
    return target

二 利用golang调用python封装好的繁简体转换函数

上面我们已经将函数封装好, 接下来就是怎么用golang去调用它了.

这里我们利用 github.com/sbinet/go-python 这个封装好的包

在安装这个包之前, 需要先配置一下环境:

sudo apt-get update
sudo apt-get install pkg-config
sudo apt-get install python-dev
go get github.com/sbinet/go-python

首先更新源, 然后后配置pkg-config, 不然在安装python-dev的时候会出问题. python-dev是给go-python提供Python.h 头文件环境

如果出了问题可以参考下面我的博客, 或者留言:
ubuntu下安装python-dev遇到的问题
pkg-config: exec: “pkg-config”: executable file not found in $PATH

现在环境搭建好了, 开始写代码:

// font-convert.go
package convert

import (
	"encoding/json"
	"github.com/sbinet/go-python"
	"log"
)

var (
	simple2tradition *python.PyObject     // 简体转繁体函数变量
	tradition2simple *python.PyObject     // 繁体转简体函数变量
)

//  go build main.go && PYTHONPATH=./convert ./main

func init() {
	err := python.Initialize()     // 初始化
	if err != nil {
		log.Fatal(err)
	}
	fontConvert := python.PyImport_ImportModule("font-convert")  // 导入之前的模块, 也就是 font-convert.py 这个文件
	if fontConvert == nil {
		panic("Error importing module")
	}

	simple2tradition = fontConvert.GetAttrString("simple2tradition")  // 获取模块中定义的函数 simple2tradition
	if simple2tradition == nil {
		panic("Error importing function")
	}

	tradition2simple = fontConvert.GetAttrString("tradition2simple")  // 获取模块中定义的函数 tradition2simple 
	if tradition2simple == nil {
		panic("Error importing function")
	}
}
// 释放函数
func PythonFinalize() {
	python.Finalize()
}
// src:源字符串
// condition: 转换条件, 转换为繁体还是简体
func FontConvert(src, condition string) string {
	bArgs := python.PyTuple_New(1)
	err := python.PyTuple_SetItem(bArgs, 0, python.PyString_FromString(src))
	if err != nil {
		panic(err)
	}
	var res *python.PyObject
	if condition == "traditional" {
		res = simple2tradition.Call(bArgs, python.PyDict_New())
	} else if condition == "simplified" {
		res = tradition2simple.Call(bArgs, python.PyDict_New())
	} else {
		return src
	}

	return python.PyString_AS_STRING(res)
}

最后看一下文件组织目录:
在这里插入图片描述
运行命令:

go build main.go && PYTHONPATH=./convert  ./main
PYTHONPATH=./convert

如果觉得上面的很麻烦, 这里有一个简单的golang调用python的示例:
https://www.datadoghq.com/blog/engineering/cgo-and-python/