golang 字符串strings Title, Upper, Lower, Fold的代替处理库golang.org/x/text/cases使用方法总结, Caser对象使用

golang中当我们在使用 strings.Title, Upper, Lower, Fold函数是都会提提已启用,建议我们使用能够正确处理Unicode的字符处理扩展包golang.org/x/text/cases 来代替内置strings包中的相关函数,用于处理字符大小写(如 Title,  Upper, Lower, Fold

text/cases 大小写处理定义

golang官方提供的这个扩展包text/cases 主要通过 Caser这个对象来处理字符串的大小写,他的定义如下:

type Caser
    func Fold(opts ...Option) Caser
    func Lower(t language.Tag, opts ...Option) Caser
    func Title(t language.Tag, opts ...Option) Caser
    func Upper(t language.Tag, opts ...Option) Caser
    func (c Caser) Bytes(b []byte) []byte
    func (c Caser) Reset()
    func (c Caser) Span(src []byte, atEOF bool) (n int, err error)
    func (c Caser) String(s string) string
    func (c Caser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
type Option
    func HandleFinalSigma(enable bool) Option

Caser Example测试用例

import (
	"fmt"
    "testing"

	"golang.org/x/text/cases"
	"golang.org/x/text/language"
)


func ExampleTextCases() {
	src := []string{
		"hello world!",
		"你好golang!",
		"i with dot",
		"'n ijsberg",
		"here comes O'Brian",
	}
	for _, c := range []cases.Caser{
		cases.Upper(language.SimplifiedChinese), // 指定语言为简体中文
		cases.Lower(language.Und),
		// cases.Lower(language.Tag{}), // 注意这里的Tag{}和Und是一样的效果
		cases.Title(language.Und, cases.NoLower), // 可选参数使用
	} {
		fmt.Println("")
		for _, s := range src {
			// 获取当前运行的函数名
			ff := fmt.Sprintf("%#v", c)
			fname, _ := strings.CutPrefix(strings.Split(ff, ")(")[0], "cases.Caser{t:(*cases.")

			fmt.Printf("cases函数:%v 输入字符串: %s 转换后: %s \n", fname, s, c.String(s))
		}
	}
	//output:
	// cases函数:undUpperCaser 输入字符串: hello world! 转换后: HELLO WORLD!
	// cases函数:undUpperCaser 输入字符串: 你好golang! 转换后: 你好GOLANG!
	// cases函数:undUpperCaser 输入字符串: i with dot 转换后: I WITH DOT
	// cases函数:undUpperCaser 输入字符串: 'n ijsberg 转换后: 'N IJSBERG
	// cases函数:undUpperCaser 输入字符串: here comes O'Brian 转换后: HERE COMES O'BRIAN

	// cases函数:undLowerCaser 输入字符串: hello world! 转换后: hello world!
	// cases函数:undLowerCaser 输入字符串: 你好golang! 转换后: 你好golang!
	// cases函数:undLowerCaser 输入字符串: i with dot 转换后: i with dot
	// cases函数:undLowerCaser 输入字符串: 'n ijsberg 转换后: 'n ijsberg
	// cases函数:undLowerCaser 输入字符串: here comes O'Brian 转换后: here comes o'brian

	// cases函数:titleCaser 输入字符串: hello world! 转换后: Hello World!
	// cases函数:titleCaser 输入字符串: 你好golang! 转换后: 你好Golang!
	// cases函数:titleCaser 输入字符串: i with dot 转换后: I With Dot
	// cases函数:titleCaser 输入字符串: 'n ijsberg 转换后: 'N Ijsberg
	// cases函数:titleCaser 输入字符串: here comes O'Brian 转换后: Here Comes O'Brian
}

 Caser结构体定义参考

可见这个结构体的属性t 是一个接口SpanningTransformer, 而这个接口又继承了Transformer接口

type Caser struct {
	t transform.SpanningTransformer
}



type SpanningTransformer interface {
	Transformer

	Span(src []byte, atEOF bool) (n int, err error)
}


// Transformer transforms bytes.
type Transformer interface {

	Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)

	Reset()
}

Option定义参考

这里外部可用的Option选项 通过暴露NoLower, Compact 这2个变量和1个函数 HandleFinalSigma(enable bool)  来提供给外部使用 , 如: cases.Title(language.Und, cases.HandleFinalSigma(true)).String("xxx") 


// An Option is used to modify the behavior of a Caser.
type Option func(o options) options


var (
	// NoLower disables the lowercasing of non-leading letters for a title
	// caser.
	NoLower Option = noLower

	// Compact omits mappings in case folding for characters that would grow the
	// input. (Unimplemented.)
	Compact Option = compact
)

type options struct {
	noLower bool
	simple  bool

	// TODO: segmenter, max ignorable, alternative versions, etc.

	ignoreFinalSigma bool
}


func getOpts(o ...Option) (res options) {
	for _, f := range o {
		res = f(res)
	}
	return
}

func noLower(o options) options {
	o.noLower = true
	return o
}

func compact(o options) options {
	o.simple = true
	return o
}

// HandleFinalSigma specifies whether the special handling of Greek final sigma
// should be enabled. Unicode prescribes handling the Greek final sigma for all
// locales, but standards like IDNA and PRECIS override this default.
func HandleFinalSigma(enable bool) Option {
	if enable {
		return handleFinalSigma
	}
	return ignoreFinalSigma
}

细心的你可能已经注意到这里的这个Option可选参数函数在这里他是通过在内部定义了2个常量来提供给包外使用,这个我们之前的其他库中的Option用法zap logger 日志记录库 options接口类型 可选参数(函数)使用 总结-CSDN博客稍有不同,但是原理都是一样的。

总结:这个cases包和strings包的函数用法是有很大的区别的, cases包中使用了一个结构体Caser来处理Unicode语言,将原来strings包中的直接的函数调用改为cases包中的Caser方法的调用,功能比原来更加强大。 如Title的使用,由strings.Title("xxx") 改为 cases.Lower(language.SimplifiedChinese).String("xxx")   在这个过程中,我们可以对Caser对应应用更多的Option可选参数, 这个可选参数也是一个函数.

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在最新版本的 Go 中,`golang.org/x/net/websocket` 包已经被废弃,推荐使用官方提供的 `github.com/gorilla/websocket` 包来处理 WebSocket 连接。以下是一个简单示例,演示如何使用 `github.com/gorilla/websocket` 包进行 WebSocket 通信: ```go package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func main() { http.HandleFunc("/ws", handleWebSocket) log.Fatal(http.ListenAndServe(":8080", nil)) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("WebSocket 连接升级失败:", err) return } defer conn.Close() for { // 读取消息 _, msg, err := conn.ReadMessage() if err != nil { log.Println("WebSocket 读取消息失败:", err) break } log.Printf("收到 WebSocket 消息:%s\n", msg) // 处理消息 // ... // 发送响应 err = conn.WriteMessage(websocket.TextMessage, []byte("收到消息")) if err != nil { log.Println("WebSocket 发送响应失败:", err) break } } } ``` 在上述示例中,我们首先创建了一个 `websocket.Upgrader` 对象,并设置了其中的 `CheckOrigin` 函数以允许跨域请求。然后我们定义了一个 `handleWebSocket` 函数,用于处理 WebSocket 连接。 在 `handleWebSocket` 函数中,我们通过 `upgrader.Upgrade` 方法将 HTTP 连接升级为 WebSocket 连接。然后,我们进入一个循环来处理收到的消息。您可以在循环中添加您自己的消息处理逻辑,并通过 `conn.WriteMessage` 方法发送响应。 请注意,这只是一个简单的示例,您可能需要根据您的实际需求进行适当的配置和错误处理。 希望以上信息对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值