dqhr76378
2018-12-17 03:59
浏览 141
已采纳

无法在golang中使用“ ”正确分割字符串

I am trying to split the output of free command into 3 lines. A general output of free is

total used free shared buff/cache available Mem: 16309236 11129884 860300 534300 4319052 4306208 Swap: 20971516 234236 20737280

But when I am using strings.Split() of golang the Split function is now behaving as expected. I tried debugging it but could not find anything.

Kindly help.

package main

import "os/exec"
import "github.com/golang/glog"
import "fmt"
import "strings"
import "errors"

func thisWorks() {
    str_out := "hello world 
 How are you 
this is good"
    lines := strings.Split(str_out, "
")
    fmt.Printf("lines is  
%s
", lines)
}

func GetFreeOutput() error {

    var errMsg string
    bytes_out, err := exec.Command("free").Output()

    // This shows that the output has 10 (newline) in it.
    fmt.Println(bytes_out)

    if err != nil {
        errMsg = "Error geting output of free command"
        glog.Fatal(errMsg)
        return errors.New(errMsg)
    }

    str_out := string(bytes_out)
    fmt.Printf("str_out is  
%s", str_out)

    // This is not splitting the lines, it is converting the whole output to a single line.
    fmt.Println("
Lines are ", strings.Split(str_out, "
"))

    index_of_newline := strings.Index(str_out, "
")

    // This gives the index of "
" as 79 on my machine, which is correct.
    fmt.Printf("
Index is %d", index_of_newline)

    fmt.Println("
Line using index are ", strings.Split(str_out, string(str_out[index_of_newline])))

    return nil
}

func main() {
    err := GetFreeOutput()
    fmt.Printf("Error is %s", err)
}

图片转代码服务由CSDN问答提供 功能建议

我正在尝试将 free 命令的输出分成3行。 free的一般输出是

可用的可用共享共享buff /缓存总数 Mem:16309236 11129884 860300 534300 4319052 4306208 交换:20971516 234236 20737280 < / p>

但是当我使用 golang 的strings.Split()时, Split 函数现在表现出预期的效果。 我尝试调试它,但是找不到任何东西。

请帮助。

 包main 
 
import“ os / exec” 
import“ github.com/golang/glog"
import” fmt“ 
import” strings“ 
import” errors  “ 
 
func thisWorks(){
 str_out:=”你好,世界
 
这很好吗“ 
行:= strings.Split(str_out,” 
“)
 fmt.Printf(” 行是
%s 
“,行)
} 
 
func GetFreeOutput()错误{
 
 var errMsg string 
 bytes_out,err:= exec.Command(” free“)。Output()  
 
 //这表明输出中有10(换行符)。
 fmt.Println(bytes_out)
 
如果err!= nil {
 errMsg =“获取自由命令的输出时出错” \  n glog.Fatal(errMsg)
返回错误。New(errMsg)
} 
 
 str_out:=字符串(bytes_out)
 fmt.Printf(“ str_out为
%s”,str_out)
 \  n //这不会拆分行,而是将整个输出转换为单行。
 fmt.Println(“ 
Lines are”,strings.Split(str_out,“ 
”))
 
 index_of_newline  := strings.Index(str_out,“ 
”)
 
 //这会在我的m上将“ 
”的索引设为79  
 fmt.Printf(“ 
Index is%d”,index_of_newline)
 
 fmt.Println(“ 
使用索引的行是”,strings.Split(str_out,string(str_out [index_of_newline]  ))))
 
返回nil 
} 
 
func main(){
 err:= GetFreeOutput()
 fmt.Printf(“ Error is%s”,err)
} 
   
 
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douchenchepan6465 2018-12-17 04:19
    已采纳

    Split is working as you expect. The issue is with how you print the lines.

    The second argument to Println below is a slice.

     // This is not splitting the lines, it is converting the whole output to a single line.
    fmt.Println("
    Lines are ", strings.Split(str_out, "
    "))
    

    Per the fmt documentation, a slice is printed as:

    [elem0 elem1 ...]
    

    Notice that elements are separated by spaces. Splitting by and printing will in effect replace with ' '. Try this code to confirm that split is working as expected:

    for i, line := range strings.Split(str_out, "
    ") {
       fmt.Println(i, line)
    }
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题