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

strings.Title的使用

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

golang 复制代码
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标点符号再来看一个示例:

golang 复制代码
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)  
    }  
}

输出结果为:

js 复制代码
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处理过后的字符串。

相关推荐
Honyee10 分钟前
java使用UCanAccess操作Access
java·后端
Devil枫10 分钟前
Kotlin项目实战与总结
开发语言·jvm·kotlin
八苦17 分钟前
留个VKProxy性能测试记录
后端
SimonKing21 分钟前
你的Redis分布式锁还在裸奔?看门狗机制让锁更安全!
java·后端·程序员
追逐时光者22 分钟前
一个 .NET 开源、免费、以社区为中心的单元测试框架
后端·.net
yeziyfx27 分钟前
kotlin中集合的用法
android·开发语言·kotlin
风无雨42 分钟前
GO启动一个视频下载接口 前端可以边下边放
前端·golang·音视频
三体世界1 小时前
TCP传输控制层协议深入理解
linux·服务器·开发语言·网络·c++·网络协议·tcp/ip
kangkang-1 小时前
PC端基于SpringBoot架构控制无人机(二):MavLink协议
java·spring boot·后端·无人机
随心点儿2 小时前
使用python 将多个docx文件合并为一个word
开发语言·python·多个word合并为一个