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

2 回复

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)
	}
}

关键修改:

  1. 移除了多余的strings.Trim(userString, "\n"),因为strings.TrimSpace()已经处理了换行符
  2. 对分割后的每个字段单独使用strings.TrimSpace()来移除字段值前后的空格
  3. 这样姓名中的空格(如"Patrick Stroud")会保留,但数字字段前后的空格会被移除

如果您确实需要移除姓名中的所有空格,可以使用:

employees[i].name = strings.ReplaceAll(userInfo[0], " ", "")

但这会将"Patrick Stroud"变成"PatrickStroud"。

回到顶部