GO语言去空白,strings.TrimSpace不起作用

在学习server-client的编写,代码如下:

package main

import (
    "fmt"
    "net"
    "strings"
)

func main() {
    fmt.Println("Starting the server...")
    listener, err := net.Listen("tcp", "localhost:33445")
    if err != nil {
        fmt.Println("Error Listenig", err.Error())
        return
    }

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting", err.Error())
            return
        }
        go doServerStuff(conn)
    }
}

func doServerStuff(conn net.Conn) {
    for {
        buf := make([]byte, 512)
        _, err := conn.Read(buf)
        if err != nil {
            fmt.Println("Error reading", err.Error())
            return
        }

        input := string(buf)

        fmt.Println("The input is", strings.TrimSpace(input))

        fmt.Printf("Received data: %s\n", strings.TrimSpace(string(buf)))
    }
}

这是server端的代码;在最后的打印输出,用了这个TrimSpace函数还是不能将后面的空格去掉,请问下是什么原因呢?难道后面的不是空格?我用过len函数来查看,无论是是否使用TrimSpace函数,长度都是512;我知道是在定义slice的时候指定了长度,但是转成字符串之后应该能去掉的..

阅读 39.1k
3 个回答
新手上路,请多包涵

试试这个
strings.Replace(str, "\x00", "", -1)

新手上路,请多包涵

[]byte中每一个byte的默认值是0,而空格的值是32;按照实验的结果,TrimSpace可以剪掉byte为32的(空格),但不能剪掉byte为0的:

package main

import (
    "fmt"
    "strings"
)

func main() {
    strBytes := make([]byte, 512)
    str := string(strBytes)
    fmt.Printf("the first byte is: %d\n", strBytes[0])
    fmt.Printf("str is: %s; len is: %d\n", str, len(str))
    trimmedStr := strings.TrimSpace(str)
    fmt.Printf("trimmedStr is: %s; len is: %d\n", trimmedStr, len(trimmedStr))

    // 将第一个byte改为空格
    strBytes[0] = ' '
    str = string(strBytes)
    fmt.Printf("the first byte is: %d\n", strBytes[0])
    fmt.Printf("str is: %s; len is: %d\n", str, len(str))
    trimmedStr = strings.TrimSpace(str)
    fmt.Printf("trimmedStr is: %s; len is: %d\n", trimmedStr, len(trimmedStr))
}

第二段的trimmedStr的长度为511。

代码有问题

buf := make([]byte, 512)
_, err := conn.Read(buf)
input := string(buf)

如果接收的数据不够512bytes怎么办?会变成buf末尾跟了很多个0(make([]byte, 512)会把全部都初始化为0),虽然0在c里面代表字符串的结尾,但是go可不是哦。
所以,正确的代码应该是这样

buf := make([]byte, 512)
for {
    n, err := conn.Read(buf) // n代表读取的数量。
    if err != nil {
        break
    }
    input := string(buf[:n])
}

另外回答你的问题,不过你大概也应该知道了,后面有空格是因为有了多余的0,而strings.TrimSpace()实际上并没有多虑掉0这种情况

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
101 新手上路
子站问答
访问
宣传栏