Go获取目录名作为参数

时间:2017-03-06 03:20:22

标签: shell go

从сyrillic获取目录名作为参数

如何获得完整路径,而不是切割垃圾。 示例:作为程序参数的路径/home/spouk/spouk.download/torrent/Сергей Лукьяненко, Собрание сочинений/

我进入程序的修剪版本,如何解决? /Home/spouk/spouk.download/torrent/Сергей

示例简单代码

package main

import (
    "flag"
    "fmt"
)

func main() {
    wordPtr := flag.String("path", "foo", "a string")
    flag.Parse()
    fmt.Printf("Flag: -path=`%v`\nflag.Args: %v\n", *wordPtr, flag.Args())
    fmt.Printf("Rune: %v\n", []rune(*wordPtr))
}

2 个答案:

答案 0 :(得分:4)

这不是Go代码的问题,而是如何将其传递到程序中,尝试用双引号"…"传递路径

./main -path="/home/spouk/spouk.download/torrent/Сергей Лукьяненко, Собрание сочинений/"
> Flag: -path=`/home/spouk/spouk.download/torrent/Сергей Лукьяненко, Собрание сочинений/`
> flag.Args: []
> Rune: [47 104 111 109 101 47 115 112 111 117 107 47 115 112 111 117 107 46 100 111 119 110 108 111 97 100 47 116 111 114 114 101 110 116 47 1057 1077 1088 1075 1077 1081 32 1051 1091 1082 1100 1103 1085 1077 1085 1082 1086 44 32 1057 1086 1073 1088 1072 1085 1080 1077 32 1089 1086 1095 1080 1085 1077 1085 1080 1081 47]

答案 1 :(得分:3)

这与Go无关。这与西里尔文无关。这是shell解析命令行的方式。它使用空格来分隔参数。将参数括在双引号(“)中以覆盖。例如,

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    fmt.Printf("os.Args:   %q\n", os.Args[1:])
    wordPtr := flag.String("path", "foo", "a string")
    flag.Parse()
    fmt.Printf("flag.path: %q\n", *wordPtr)
    fmt.Printf("flag.Args: %q\n", flag.Args())
}

输出:

$ go run path.go -path=/home/spouk/Сергей Лукьяненко, Собрание сочинений/
os.Args:   ["-path=/home/spouk/Сергей" "Лукьяненко," "Собрание" "сочинений/"]
flag.path: "/home/spouk/Сергей"
flag.Args: ["Лукьяненко," "Собрание" "сочинений/"]

$ go run path.go -path="/home/spouk/Сергей Лукьяненко, Собрание сочинений/"
os.Args:   ["-path=/home/spouk/Сергей Лукьяненко, Собрание сочинений/"]
flag.path: "/home/spouk/Сергей Лукьяненко, Собрание сочинений/"
flag.Args: []
  

Bash Reference Manual

     

3.1.2.3 Double Quotes

     

用双引号('“')括起字符可保留文字   引号内所有字符的值[有一些例外]。