// 文件:slug.gopackageslugimport("strings""unicode")// Make 把标题转成 URL 片段:小写、空白和标点变成 -,去掉首尾 -funcMake(titlestring)string{varbstrings.Builderdash:=falsefor_,r:=rangestrings.ToLower(title){ifunicode.IsLetter(r)||unicode.IsDigit(r){b.WriteRune(r)dash=false}elseif!dash&&b.Len()>0{b.WriteByte('-')dash=true}}returnstrings.TrimSuffix(b.String(),"-")}
// 文件:slug_test.gopackageslugimport"testing"funcTestMake(t*testing.T){cases:=[]struct{name,in,wantstring}{{"普通","Hello World","hello-world"},{"多个符号","Go -- 并发!!","go-并发"},{"首尾空白"," Redis ","redis"},{"空","",""},}for_,c:=rangecases{t.Run(c.name,func(t*testing.T){ifgot:=Make(c.in);got!=c.want{t.Fatalf("Make(%q) = %q, want %q",c.in,got,c.want)}})}}funcBenchmarkMake(b*testing.B){forb.Loop(){// Go 1.24+ 的写法;旧版本用 for i := 0; i < b.N; i++Make("Hello World From Go")}}
运行:go mod init slug && go test -v -race -cover ./... && go test -bench=. ./...