当前位置: 首页 > news >正文

Go strings.Title方法被废弃(Deprecated)

strings.Title的使用

在传统中,我们可以通过如下形式将每个单词的首字母变成大写字母,示例如下:

func TestTitle(t *testing.T) {  fmt.Println(strings.Title("hello world"))  fmt.Println(strings.Title("hell golang"))  fmt.Println(strings.Title("xiexie"))  
}

执行上述代码,对应打印结果如下:

Hello World
Hell Golang
Xiexie

可见,strings.Title 会将每个单词的首字母变成大写字母。

strings中还有两个函数:ToTitle和ToUpper,功能类似,所有字符全部变成大写。

示例如下:

func TestTitle2(t *testing.T) {  fmt.Println(strings.ToTitle("hello world"))  fmt.Println(strings.ToUpper("hello golang"))  
}

输出如下:

HELLO WORLD
HELLO GOLANG

但在IDE的提示和官方文档中都可以看到Title函数已经被废弃掉了。主要原因是:strings.Title的规则是使用单词边界,不能正确处理Unicode标点。

示例如下:

func TestTitle3(t *testing.T) {  fmt.Println(strings.Title("here comes o'brian"))  
}

输出如下:

Here Comes O'Brian

可以看出”B“也被大写了。

strings.Title的两大问题:

  • 无法正确处理Unicode标点符号。
  • 不考虑特定人类语言的大写规则。

Unicode问题

关于Unicode标点符号再来看一个示例:

func TestTitle5(t *testing.T) {  a := strings.Title("go.go\u2024go")  b := "Go.Go\u2024Go"  if a != b {  fmt.Printf("%s != %s\n", a, b)  }  
}

输出结果为:

Go.Go․go != Go.Go․Go

变量a转换处理的结果是“Go.Go․go”,但按照实际的诉求应当为“Go.Go․Go”。

特定语言问题

代码如下:

func TestTitle6(t *testing.T) {  fmt.Println(strings.Title("ijsland"))  
}

在荷兰语的单词中,“ijsland”应大写为“IJsland”,但结果转换为“Ijsland”。

golang.org/x/text/cases包

strings.Title的文档中提到了,可以通过golang.org/x/text/cases 来替代strings.Title的功能,也就是cases.Title。

cases.Title提供了基于特定语言的case map,其中有一个Title函数,签名如下:

// Title returns a Caser for language-specific title casing. It uses an  
// approximation of the default Unicode Word Break algorithm.  
func Title(t language.Tag, opts ...Option) Caser {  return Caser{makeTitle(t, getOpts(opts...))}  
}

第一个参数是 language.Tag类型,表示BCP 47种语言标记。它用于指定特定语言或区域设置的实例。

第二个参数是不定参数,类型是Option。

使用前需要先引入“golang.org/x/text” 的类库。比如:

require golang.org/x/text v0.11.0

使用实例如下:

import (  "fmt"  "golang.org/x/text/cases"  "golang.org/x/text/language"  "strings"  "testing"  
)func TestTitle4(t *testing.T) {  caser := cases.Title(language.English)  fmt.Println(caser.String("here comes o'brian"))  
}

输出结果如下:

Here Comes O'brian

对照一下strings.Title,可以看出“brain”的“b”在这里成功识别,并未被大写。

cases.Title的返回类型是Caser结构体,调用它的String方法,该方法接收一个字符串,并返回一个经过Caser处理过后的字符串。

http://www.lryc.cn/news/111449.html

相关文章:

  • vuejs源码分析之全局API(vm.$off)
  • elasticSearch常见的面试题
  • 第一课-前提-Stable Diffusion 教程
  • Python 开发工具 Pycharm —— 使用技巧Lv.2
  • 代码随想录第39天 | 62. 不同路径、63.不同路径II
  • QMT入门—初识QMT
  • C 语言的 return 语句
  • 企业级Vue路由角色权限应该怎么做?
  • 3.2.0 版本预告!Apache DolphinScheduler API 增强相关功能
  • 测试工程师的工作
  • 压力测试与测试工具jmeter的介绍
  • 解析整型最大值(Integer.MIN_VALUE)溢出变为最小值(Integer.MAX_VALUE)
  • 【openpcdet】dbinfo内的信息
  • clickhouse查询缓存
  • vue中使用Base64加密、解密以及des加密、解密
  • 关于丢失安卓秘钥的撞sha-1值的办法
  • maven如何打包你会吗?
  • idea 控制台 打印 Tomcat日志Tomcat Catalina Log控制台乱码问题
  • python我的世界
  • SpringBoot+vue 大文件分片下载
  • scanf函数读取数据 清空缓冲区
  • js 文件常用转换
  • 基于Open3D的点云处理15-特征点
  • 算法刷题Day 58 每日温度+下一个更大元素I
  • 认识 spring AOP (面向切面编程) - springboot
  • 将css文件中的px转化为rem
  • JNI之Java实现远程打印
  • YOLOv5基础知识入门(2)— YOLOv5核心基础知识讲解
  • 免费的scrum敏捷开发管理工具
  • Hive创建外部表详细步骤