【问题】
折腾:
期间,已经获得了:
文件名:EmulateLoginBaidu.go
文件后缀:.go
现在,想要通过字符串的分割和替换,获得文件名本身:
EmulateLoginBaidu
【折腾过程】
1.此处,很明显,不是简单的,直接替换文件名中的.go为空,
否则,如果是:
xxx.go.go.go
那么本来希望得到:
xxx.go.go
结果只能得到
xxx
所以,要实现,精准的,字符串的替换或截取。
另外,也最好不要用split,否则是上面的文件名中带点的,也多半被分割成多个子字符串,还要再去合并,很是麻烦。
最佳的操作是:
获得文件后缀(也可能是空)
然后从文件名(可能包含点xxx.xxx.xxx.go,可能不含后缀:xxxyyy)
然后去:
从字符串的尾部,将文件的后缀,替换为空,且仅仅替换最后的后缀,不能再往前操作了。
2.参考:
去看看:
然后继续看看别的函数,最后,终于找到我想要的了:
其直接可以实现我上面要的功能:
直接去除尾部的后缀,且如果不存在对应的后缀,则保持源字符串不变。
所以,可以去试试了: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
的效果。