Golang.org/x库初探2——text库

news2024/11/19 8:45:09

    Golang有一个很有意思的官方库,叫golang.org/x,x可能是extends,experimental,总之是一些在官方库中没有,但是又很有用的库。最近花点时间把这里有用的介绍一下。

  1. Golang.org/x库初探1——image库
  2. Golang.org/x库初探2——text库

    text库主要提供strings库的一系列Unicode和国际化适配的替代升级方案。常用的库如下:

golang.org/x/text/language

language库定义了BCP 47的语言标签支持,这里的语言指的自然语言,英语,中文等。

所谓的BCP 47 就是zh-CN这种格式的前面是语言,后面是地域的标识符(地域可选)

language库定义了Match等操作,这样你可以用来匹配最佳的语言,常用的是http中,用户在头部通过Accept-Language标识了他希望使用的语言,这样我们在服务端可以和服务器支持的语言进行匹配,寻找最合适的语言。

这个库虽然介绍的功能主要是Match功能,但同时也是cases等其他库用于标识语言的基础库,所以第一个介绍这个库。当然如果我们要做一个国际化程序,也可以把国际化标识这块,也使用lanuage库作为通用标识,以增强兼容性和标准化。

golang.org/x/text/cases

cases库用于支持国家化的大小写转换,写法如下

var case = cases.Title(language.English, cases.NoLower)
fmt.Print(case.String("beforeThis")) //BeforeThis

这里的Title就是一般的Title case的用法。Title函数支持传入附加Option,上面传入了NoLower参数,用于标识除了首字母之外,其他非小写字母不需要转化为小写。

相比于标准库,cases的具体效果还是有区别,比如 下面的测试例:

func TestCases(t *testing.T) {
	var tested = "beforeThis"
	fmt.Println("基础库Title:", strings.ToTitle(tested))
	var case1 = cases.Title(language.English)
	fmt.Println("不带Option的cases Title:", case1.String(tested))
	var case2 = cases.Title(language.English, cases.NoLower)
	fmt.Println("带Option的cases Title:", case2.String(tested))
}

输出如下:

基础库Title: BEFORETHIS
不带Option的cases Title: Beforethis
带Option的cases Title: BeforeThis

 基础库的ToTitle做完全大写转换还是有问题的,cases库就正常一点,对首字母大写即可。

而ToLower和ToUpper表现一致。

而国际化方面,主要针对几种语言做了适应性处理,主要是西欧语言的差异,这里就不多讲了,需要的同学可以从Title函数点进去看代码,有详细的注释

titleInfos = []struct {
		title     mapFunc
		lower     mapFunc
		titleSpan spanFunc
		rewrite   func(*context)
	}{
		{title, lower, isTitle, nil},                // und
		{title, lower, isTitle, afnlRewrite},        // af
		{aztrUpper(title), aztrLower, isTitle, nil}, // az
		{title, lower, isTitle, nil},                // el
		{ltUpper(title), ltLower, noSpan, nil},      // lt
		{nlTitle, lower, nlTitleSpan, afnlRewrite},  // nl
		{aztrUpper(title), aztrLower, isTitle, nil}, // tr
	}

golang.org/x/text/number

number库主要定义了很多帮助格式化数字的帮助函数,这个应该我们用的多点,可用的东西包括格式化函数和选项两类,格式化函数包括:

Decimal格式化逗号分隔的整数,例如1,234,567这种

Engineering

类科学计数法(但指数部分最多有三位),输出类似这样:12.345678 × 10⁶

PerMille

直接转成千分比数字,例如120‰
Percent       百分比

Scientific

科学计数法,输出类似这样:1.2345678 × 10⁷
 

另外,提供了多个Option来自定义输出:

FormatWidth

指定数字转换后的字符串宽度,例如

 number.PerMille(0.12, number.FormatWidth(10))会输出

“      120‰”

IncrementString

一种宽泛的四舍五入算法,例如

number.PerMille(0.16, number.IncrementString("0.3"))会输出0.3,number.PerMille(0.14, number.IncrementString("0.3"))会输出0.0

MaxFractionDigits

最大小数位数(四舍五入)
MaxIntegerDigits 最大整数位数(直接裁剪多余部分)

MinIntegerDigits

最小整数位数(补零)
MinFractionDigits最小小数位数(补零)
NoSeparator不分组数字

Precision

浮点数精度,负数为小数位数,正数为整数位数

总的用法就是和message包配合,像fmt一样使用,例如官方库的案例

func TestNumber(t *testing.T) {
	p := message.NewPrinter(language.Chinese)

	p.Printf("%v bottles.\n", number.Decimal(3321.96, number.Precision(2)))
}

其中第二行展示了格式化函数和选项的用法。

这个库我们基本可以在很多需要格式化数字的地方用到了,原来很多很复杂的自定义写法都可以用这个来处理,这个库还提供了从上述标准函数派生自定义的入口NewFormat,大家可以从库中查找使用。

golang.org/x/text/message

上面说了message库提供了一个类似fmt的国际化解决方案,同时可以和number等配合,做更多的格式化以及本地化适应的功能。

但同时他还是一个可以用于多语言翻译的库,在提供国际化方面有很大用处。

例如我们有这么一个帮助:

func TestNumber(t *testing.T) {
	pZh := message.NewPrinter(language.Make("zh"))
	pEn := message.NewPrinter(language.Make("en"))

	message.SetString(language.English, "您输入的%s不符合要求\n", "The input value %s is not legal")

	pZh.Printf("您输入的%s不符合要求\n", "1234")
	pEn.Printf("您输入的%s不符合要求\n", "1234")
}
=== RUN   TestNumber
您输入的1234不符合要求
The input value 1234 is not legal--- PASS: TestNumber (0.00s)
PASS

可以发现,英文的Printer直接转成了英文打印。

但是注意,这个定义必须完全一致才生效,所以官方的例子如下:

message.SetString(language.Dutch, "You have chosen to play %m.", "U heeft ervoor gekozen om %m te spelen.")
	message.SetString(language.Dutch, "basketball", "basketbal")
	message.SetString(language.Dutch, "hockey", "ijshockey")
	message.SetString(language.Dutch, "soccer", "voetbal")
	message.SetString(language.BritishEnglish, "soccer", "football")

	for _, sport := range []string{"soccer", "basketball", "hockey"} {
		for _, lang := range []string{"en", "en-GB", "nl"} {
			p := message.NewPrinter(language.Make(lang))
			fmt.Printf("%-6s %s\n", lang, p.Sprintf("You have chosen to play %m.", sport))
		}
		fmt.Println()
	}

他首先用了一个Sprintf来把预定义国家化字符串进行转换,再做的Printf。

这个例子里还有一点说明的是,他使用了一个"%m"来说明传入变量要取国际化值,如果改成%s则不转换。

同时,text库提供了一个可编译库gotext用于在代码中获得所有的字符串,用于简化国际化的工作。

golang.org/x/text/encoding

这个库,估计中文环境就用的很多了,就是传说中的编码库,用来做UTF-8,GBK,BIG5转换的,而且他把编码转换的框架进行了标准化,可以做不同编码格式的转换,这样就不需要再去用iconv等麻烦的东西了。

例如encoding下面的简体中文库simplifiedchinese提供了GB18030和GBK两个编码类,两个类都可以使用NewEncoder或NewDecoder来初始化一个编码器或者解码器,例如下面的例子,打开一个utf-8的文件,并转成gbk的:

	f, err := os.Open("utftext.txt")
	if err == nil {
		var out *os.File
		out, err = os.Create("gbk.txt")
		if err == nil {
			//将utf的reader转成gbk的reader
			r := simplifiedchinese.GBK.NewDecoder().Reader(f)
			//进一步读取拷贝
			io.Copy(out, r)

			out.Close()
			f.Close()
		}
	}

当然,NewDecoder().Transform()直接按byte数组转换也是可以的。

其他更多

当然,text下还有很多内容,我个人觉得用处不大,就不细讲了,包括

  1. currency: 货币支持库
  2. date: 国际化日期相关库
  3. search:本地化搜索支持,西文中差异较多,中文少
  4. secure:特殊用处下的文字有效性判断
  5. runes,collate:utf-8相关库
  6. unicode: unicode相关库
  7. transform: 转换库,可配合unicode下的各种定义来做特殊字符移除等功能
  8. 其他的功能库:feature、width
  9. 更多的编码库,包括韩文、日文等

详细的可以看官方库介绍

总的我认为:

  1. 编码转换可以直接用encoding库
  2. 国际化用message库
  3. Upper、Lower、Title等转换看需要用cases库或者标准strings库
  4. number库的功能很强大,在金融等应用场景下用处多多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原创,探店,混剪,带货,获客,发布,更新,呆头鹅批量剪辑软件

一天轻松剪辑2000条,视频批量生成工具,短视频带货,电商卖家,媒体运营多场景应用视频剪辑分镜音频合成,一次解决! 对于广大自媒体玩家最关心的话题,用了这个AI全自动呆头鹅批量视频剪辑软件做出来…

骑电动车不戴头盔识别抓拍系统 yolov7

骑电动车不戴头盔识别抓拍系统通过Python基于YOLOv7网络深度学习技术,对现场画面中骑电动车不戴头盔识别抓拍包括骑乘人员和带乘人员。YOLOv7 在 5 FPS 到 160 FPS 范围内,速度和精度都超过了所有已知的目标检测器,并在V100 上,30…

如何设置等高线坐标系并输出

如何设置等高线坐标系并输出发布时间:2018-01-17 版权:投影设置及数据导出矢量等高线生成完成后(详细生成过程参加上一章节:矢量等高线生成),我们就能够设置投影和导出等高线数据。投影设置我们生成等高线默认的坐标是…

Rust之错误处理(一):无法恢复的错误panic!

开发环境 Windows 10Rust 1.66.1VS Code 1.74.3项目工程 这里继续沿用上次工程rust-demo 错误处理 错误是软件生活中的一个事实,所以Rust有一些处理出错情况的功能。在许多情况下,Rust要求你承认错误的可能性,并在你的代码编译前采取一些…

Google结构化数据

为什么要向网页添加结构化数据? 添加结构化数据可让您获得对用户更有吸引力的搜索结果,并可能会鼓励用户与您的网站进行更多互动,这就是富媒体搜索结果。 以下是一些为网站实现了结构化数据的案例研究: Rotten Tomatoes 为 10 万…

【学习笔记之Linux】工具之gdb

背景知识: 首先我们要知道,程序的发布一共有两种模式,一种是debug模式,是我们程序员自己编写代码的模式,可以进行调试,这个模式下编译出来的程序是包含调试信息的;一种是release模式&#xff0c…

AntV G6 组织图使用(后端渲染数据)

一、业务场景: 点击按钮,跳转页面并显示该数据的组织架构图(类似于粒子效果) 二、问题描述: 初始写死的数据能显示,但是从接口请求到的数据赋上值 渲染不了 三、具体实现步骤: (1&…

python GUI And Tkinter 01

目录 一、基础介绍 二、创建窗口 1、创建完窗口后还需要知道窗口的相关属性 2、widget相关控件 3、原本tkinter有的Widget。 4、widget的共同属性 1. Configuration 2. Event Processing 3. Event callbacks 4. Alarm handlersafter(time,callback):间隔指定时间后调…

Python logging 库的『完整教程』

前言 本文的标题是『完整』。所谓『完整』,大意是想表达:提炼出一组最小的经验组合,并且能够快速应用于工程中,能 work,甚至能完美地 work。这篇文章就是想要做到『如何能完美地work』。 初衷 最原始的初衷就是&…

nmap 扫描数据分析

本案22端口为开放端口,110为未开放端口 Wireshark上使用下面的表达式 ip.addr192.168.104.127 and ip.addr192.168.104.61 and tcp.port22 ip.addr192.168.104.127 and ip.addr192.168.104.61 and tcp.port110 命令一、 nmap -sS SYN-->SYN ACK-->RST …

电脑技巧:Windows这些自带应用尽量不要删,否则影响系统运行

目录 第一种:带有“microsoft”字样的软件尽量不卸载。 第二种:带有“Intel”或者“英特尔”的程序名称不要卸载。 第三种:windows驱动程序包尽量不要卸载 第四种:Adobe flash player不建议卸载 当电脑太卡,运行变…

C/C++ - 从代码到可执行程序的过程

(1)预编译 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下: 删除所有的#define,展开所有的宏定义。处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。处理“#inc…

简单工厂模式

简单工厂模式所谓组件:从设计上讲,组件就是能完成一定功能的封装体。小到一个类,大到一个系统,都可以称为组件,因为一个小系统放到更大的系统里面去,也就当个组件而已。模式定义:提供一个创建对…

servlet运用自定义分发优化servlet泛滥

servlet优化 Web 层的 Servlet 个数太多了,不利于管理和编写 我们发现每一个功能都需要定义一个 servlet,一个模块需要实现增删改查功能,就需要4个 servlet,模块一多就会造成servlet 泛滥。此时我们就想 servlet 能不能像 servi…

YOLOv6 训练自己的数据集

项目地址:https://github.com/meituan/YOLOv6 论文地址:https://arxiv.org/abs/2209.02976 论文解析:http://t.csdn.cn/0ZQbV YOLOv6 是一种专为工业应用设计的单级对象检测框架,具有硬件友好的高效设计和高性能。YOLOv6-N 在 NVI…

【windows】docker与docker-compose部署spring boot项目

看完不会用,我倒立**,保姆级教学 docker部署项目 采用Dockerfile部署 docker-compose部署项目 docker-compose部署,实际上是对容器的编排,以及容器间的一些依赖 比如一个springboot项目,需要使用redis,…

深入 Redis sds

文末有视频讲解 在上一个模块中,我和小伙伴们一起学习了 Redis 最核心的命令,主要涉及 String、List、Hash、Set、Sorted Set 五种数据结构的命令,同时,我们还介绍了每种数据结构的实战场景,并带领小伙伴们使用 Java 语…

11、ThingsBoard-租户配置

1、概述 租户配置(tenant profile)如其名是租户相关的配置,通俗一点就是给你这个租户的功能增加一些限制,如果你加钱,我就给你把限制设置高一点,thingsboard官方那个收费的版本不就是这样的吗?租户配置在系统层,系统管理员可以创建租户配置,然后使用租户配置为多个租…

centos7安装kubeadm

centos7安装kubeadm 一、基础设置 1、设置主机名 hostnamectl set-hostname master hostnamectl set-hostname node01vim /etc/hosts 192.168.198.169 master 192.168.198.170 note01hostnamectl hostnamectl 是在 centos7 中新增加的命令,它是是用来管理给定主机…

2023年我花费数小时整理的Java常用类进阶学习文档,你学会了吗?

文章目录1. 基本类型的包装类1.1 概念1.2 常用的属性1.3 常用的方法1.4 自动装箱和自动拆箱2. 字符串类2.1 String 类2.2 StringBuilder类2.3 StringBuffer类2.4 StringBuilder 的扩容机制3. 数字常用类3.1 Math 类3.2 Radom 类4. 枚举类5. 日期类5.1 Date 类5.2 DateFormat 类…