Golang字符串空格无法去除的问题解决方案
Golang字符串空格无法去除的问题解决方案
我正在尝试从命令行控制台读取字符串并移除其中的空格,但发现 strings.Trim() 和 strings.TrimSpace() 函数似乎没有正确工作。
例如,以下是我的代码:
type employee struct {
name string
age int
salary int64 //64-bit integer assignment to salary
}
func main() {
var employees [5]employee
inputReader := bufio.NewReader(os.Stdin)
for i := range employees {
fmt.Println("Please enter Employee Information", i+1, "'s name")
fmt.Println("Please do so using a ; value separated sequence")
fmt.Println("E.g. Patrick Stroud; 48; 140565")
fmt.Print(">")
userString, err := inputReader.ReadString('\n')
if err != nil {
log.Fatal(err) //Equivalent to fmt.Println(err)
}
userString = strings.Trim(userString, "\n")
userString = strings.TrimSpace(userString)
userInfo := strings.Split(userString, ";")
employees[i].name = userInfo[0]
employees[i].age, _ = strconv.Atoi(userInfo[1]) //error checking not done here on purpose
employees[i].salary, _ = strconv.ParseInt(userInfo[2], 10, 64) //error checking not done to not cause error
}
fmt.Println("# Employee Name\t Age\t Salary")
fmt.Println("=============================================")
p := message.NewPrinter(language.English)
for i := range employees {
fmt.Printf("%s\t", employees[i].name)
fmt.Printf("%d\t", employees[i].age)
p.Printf("%d\n", employees[i].salary)
}
}
返回的输出如下:
Please enter Employee Information 1 's name
Please do so using a ; value separated sequence
E.g. Patrick Stroud; 48; 140565
>Patrick Stroud; 48; 140565
Please enter Employee Information 2 's name
Please do so using a ; value separated sequence
E.g. Patrick Stroud; 48; 140565
>Ursula Spencer; 27; 36450
Please enter Employee Information 3 's name
Please do so using a ; value separated sequence
E.g. Patrick Stroud; 48; 140565
>Clifton Stillman; 65; 99900
Please enter Employee Information 4 's name
Please do so using a ; value separated sequence
E.g. Patrick Stroud; 48; 140565
>William Reynolds; 37; 77550
Please enter Employee Information 5 's name
Please do so using a ; value separated sequence
E.g. Patrick Stroud; 48; 140565
>Dean Niles; 53; 120000
# Employee Name Age Salary
=============================================
Patrick Stroud 0 0
Ursula Spencer 0 0
Clifton Stillman 0 0
William Reynolds 0 0
Dean Niles 0 0
可以看到姓名字段仍然包含空格,但根据第52行的代码:
userString = strings.TrimSpace(userString)
这种情况不应该发生。为什么会这样?
更多关于Golang字符串空格无法去除的问题解决方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html
TrimSpace 函数会返回一个新的字符串,其中所有开头和结尾的空白字符都会被移除。如果你想移除字符串中间的空格,可以使用 Replace 函数。
更多关于Golang字符串空格无法去除的问题解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题在于strings.Trim()和strings.TrimSpace()确实在工作,但它们只移除字符串开头和结尾的空格字符。在您的例子中,姓名中的空格(如"Patrick Stroud"中的空格)位于字符串中间,这些函数不会移除它们。
您看到Age和Salary显示为0的原因是userInfo[1]和userInfo[2]包含前导空格,导致strconv.Atoi()和strconv.ParseInt()解析失败。
以下是修正后的代码:
type employee struct {
name string
age int
salary int64
}
func main() {
var employees [5]employee
inputReader := bufio.NewReader(os.Stdin)
for i := range employees {
fmt.Println("Please enter Employee Information", i+1, "'s name")
fmt.Println("Please do so using a ; value separated sequence")
fmt.Println("E.g. Patrick Stroud; 48; 140565")
fmt.Print(">")
userString, err := inputReader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
// 移除换行符和首尾空格
userString = strings.TrimSpace(userString)
// 分割字符串
userInfo := strings.Split(userString, ";")
// 对每个字段单独使用TrimSpace移除前后空格
employees[i].name = strings.TrimSpace(userInfo[0])
ageStr := strings.TrimSpace(userInfo[1])
salaryStr := strings.TrimSpace(userInfo[2])
employees[i].age, _ = strconv.Atoi(ageStr)
employees[i].salary, _ = strconv.ParseInt(salaryStr, 10, 64)
}
fmt.Println("# Employee Name\t Age\t Salary")
fmt.Println("=============================================")
p := message.NewPrinter(language.English)
for i := range employees {
fmt.Printf("%s\t", employees[i].name)
fmt.Printf("%d\t", employees[i].age)
p.Printf("%d\n", employees[i].salary)
}
}
关键修改:
- 移除了多余的
strings.Trim(userString, "\n"),因为strings.TrimSpace()已经处理了换行符 - 对分割后的每个字段单独使用
strings.TrimSpace()来移除字段值前后的空格 - 这样姓名中的空格(如"Patrick Stroud")会保留,但数字字段前后的空格会被移除
如果您确实需要移除姓名中的所有空格,可以使用:
employees[i].name = strings.ReplaceAll(userInfo[0], " ", "")
但这会将"Patrick Stroud"变成"PatrickStroud"。

