【已解决】go语言中字符串的分割和替换:去掉文件名中的后缀

【问题】

折腾:

【已解决】go语言中实现获得当前文件的文件名

期间,已经获得了:

文件名: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

去看看:

func Replace

然后继续看看别的函数,最后,终于找到我想要的了:

func TrimSuffix

其直接可以实现我上面要的功能:

直接去除尾部的后缀,且如果不存在对应的后缀,则保持源字符串不变。

所以,可以去试试了:

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

 

至此,全部实现了预期的效果了:

got filenameOnly EmulateLoginBaidu

 

【总结】

在已经获得了带后缀的文件名和后缀名后,可以通过:

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

的效果。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量