【问题】
折腾:
期间,已经获得了:
文件名:EmulateLoginBaidu.go
文件后缀:.go
现在,想要通过字符串的分割和替换,获得文件名本身:
EmulateLoginBaidu
【折腾过程】
1.此处,很明显,不是简单的,直接替换文件名中的.go为空,
否则,如果是:
xxx.go.go.go
那么本来希望得到:
xxx.go.go
结果只能得到
xxx
所以,要实现,精准的,字符串的替换或截取。
另外,也最好不要用split,否则是上面的文件名中带点的,也多半被分割成多个子字符串,还要再去合并,很是麻烦。
最佳的操作是:
获得文件后缀(也可能是空)
然后从文件名(可能包含点xxx.xxx.xxx.go,可能不含后缀:xxxyyy)
然后去:
从字符串的尾部,将文件的后缀,替换为空,且仅仅替换最后的后缀,不能再往前操作了。
2.参考:
How to replace a single char inside a string – golang
去看看:
然后继续看看别的函数,最后,终于找到我想要的了:
其直接可以实现我上面要的功能:
直接去除尾部的后缀,且如果不存在对应的后缀,则保持源字符串不变。
所以,可以去试试了:
package main import ( "fmt" //"log" //"os" //"io/ioutil" //"net/http" "runtime" "path" "strings" ) func main() { fmt.Printf("this is EmulateLoginBaidu.go\n") _, fulleFilename, line, _ := runtime.Caller(0) fmt.Println(fulleFilename) fmt.Println(line) var filenameWithSuffix string filenameWithSuffix = path.Base(fulleFilename) fmt.Println("filenameWithSuffix=", filenameWithSuffix) var fileSuffix string fileSuffix = path.Ext(filenameWithSuffix) fmt.Println("fileSuffix=", fileSuffix) var filenameOnly string filenameOnly = strings.TrimSuffix(filenameOnly, fileSuffix) fmt.Println("filenameOnly=", filenameOnly) }
结果是:
D:\tmp\tmp_dev_root\go\src\github.com\user\EmulateLoginBaidu>go run EmulateLoginBaidu.go this is EmulateLoginBaidu.go D:/tmp/tmp_dev_root/go/src/github.com/user/EmulateLoginBaidu/EmulateLoginBaidu.go 17 filenameWithSuffix= EmulateLoginBaidu.go fileSuffix= .go filenameOnly=
很明显,出错了。
3.再去试试:
package main import ( "fmt" //"log" //"os" //"io/ioutil" //"net/http" "runtime" "path" "strings" ) func main() { fmt.Printf("this is EmulateLoginBaidu.go\n") _, fulleFilename, line, _ := runtime.Caller(0) fmt.Println(fulleFilename) fmt.Println(line) var filenameWithSuffix string filenameWithSuffix = path.Base(fulleFilename) fmt.Println("filenameWithSuffix=", filenameWithSuffix) var fileSuffix string fileSuffix = path.Ext(filenameWithSuffix) fmt.Println("fileSuffix=", fileSuffix) var filenameOnly string filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix) fmt.Println("filenameOnly=", filenameOnly) }
结果是:
D:\tmp\tmp_dev_root\go\src\github.com\user\EmulateLoginBaidu>go run EmulateLoginBaidu.go this is EmulateLoginBaidu.go D:/tmp/tmp_dev_root/go/src/github.com/user/EmulateLoginBaidu/EmulateLoginBaidu.go 17 filenameWithSuffix= EmulateLoginBaidu.go fileSuffix= .go filenameOnly= EmulateLoginBaidu
得到了基本的效果:
将.go从EmulateLoginBaidu.go的尾部去除。
4.再去试试,其他一些效果:
filenameWithSuffix = "EmulateLoginBaidu" fileSuffix = ".go" var filenameOnly string filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix) fmt.Println("filenameOnly=", filenameOnly)
结果是:
filenameOnly= EmulateLoginBaidu
5.再去试试:
//filenameWithSuffix = "EmulateLoginBaidu" //fileSuffix = ".go" filenameWithSuffix = "EmulateLoginBaidu.go.go.go" fileSuffix = ".go" var filenameOnly string filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix) fmt.Println("filenameOnly=", filenameOnly)
结果是:
filenameOnly= EmulateLoginBaidu.go.go
6.再去试试:
filenameWithSuffix = "EmulateLoginBaidu.go.txt" fileSuffix = ".go" var filenameOnly string filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix) fmt.Println("filenameOnly=", filenameOnly)
结果是:
filenameOnly= EmulateLoginBaidu.go.txt
至此,全部实现了预期的效果了:
【总结】
在已经获得了带后缀的文件名和后缀名后,可以通过:
package main import ( "fmt" "runtime" "path" "strings" ) func main() { _, fulleFilename, line, _ := runtime.Caller(0) fmt.Println(fulleFilename) fmt.Println(line) var filenameWithSuffix string filenameWithSuffix = path.Base(fulleFilename) fmt.Println("filenameWithSuffix=", filenameWithSuffix) var fileSuffix string fileSuffix = path.Ext(filenameWithSuffix) fmt.Println("fileSuffix=", fileSuffix) var filenameOnly string filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix) fmt.Println("filenameOnly=", filenameOnly) }
获得希望的效果:
D:\tmp\tmp_dev_root\go\src\github.com\user\EmulateLoginBaidu>go run EmulateLoginBaidu.go D:/tmp/tmp_dev_root/go/src/github.com/user/EmulateLoginBaidu/EmulateLoginBaidu.go 17 filenameWithSuffix= EmulateLoginBaidu.go fileSuffix= .go filenameOnly= EmulateLoginBaidu
的效果。
转载请注明:在路上 » 【已解决】go语言中字符串的分割和替换:去掉文件名中的后缀