Tag - echo

go echo    2016-04-04 23:18:39    265    0    0
## 三种实现方法 ### 1. 第一种方式: echo1.go ``` package main import( "fmt" "os" ) func main() { var s, sep string for i := 1; i < len(os.Args); i++ { s += sep + os.Args[i] sep = " " } fmt.Println(s) } ``` ### 2. 第二种方式: echo2.go ``` package main import ( "fmt" "os" ) func main() { s, sep := "", " " for _, arg := range os.Args[1:] { s += sep + arg } fmt.Println(s) } ``` ### 3. 第三种方式: echo3.go ``` package main import ( "fmt" "os" "strings" ) func main() { fmt.Println(strings.Join(os.Args[1:], " ")) } ``` 三种有些差异的方法实现了同一功能. --- 1. **多package声明的简化写法** ``` import ( "fmt" "os" "strings" ) ``` **gofmt** 还会按照字母顺序排列包名. 2. **slice**; os.Args这个变量是一个字符串(string)的slice,与python中的切片类似,是一个简版的动态数组. 3. **for 的语法;** for 语句, while, 以及死循环. ``` for initialization; condition; post { // zero or more statements } // a traditional "while" loop for condition { // ... } // a traditional infinite loop for { // ... } ``` 4. **var 变量的简写** := 符号初始化和赋值 i ,是 var xxx = yyy 的一种简写方式.**Go语言会自动根据等号右边的值的类型,判断左边的值的类型** 5. **自增表达式** i++ 等价与 i += 1, 以及 i = i + 1 对应的还有 i--. 这些在Go语言里是**语句**,而不像C系的其他语言里是**表达式**,所以, - **在Go语言里,j = i++ 是非法的** - **++ 和 --都只能放在变量名后面,因此 --i 也是非法的** 6.**另一种循环的写法** ``` for _, arg := range os.Args[1:] { s += sep + arg sep = " " } ``` 每一次循环迭代,range都会返回一对结果: - 当前迭代的下标 - 该下标处的值 但是在这个例子中,我们不需要下标,但是因为range的处理要求我们必须同时处理下标和值.我们可以: - 在这里声明一个接收index的临时变量来解决这个问题,但是Go语言又不允许声明而后续代码中不适用这个变量,如果你这样做了编译器将会报错; - 使用**空白标识符**,对,就是那个**下划线"_"**.空白标识符可以在任何你接收自己不需要处理的值时使用. 在这里,我们用它来忽略掉range返回的那个没用的下标值. 由于遍历os.Args的下标索引是隐式自动生成的,可以避免因显式更新索引而导致的错误. --- ### 7. **变量声明的多种方法** 以下这些写法都是等价的: ``` s := "" var s string var s = "" var s string = "" ``` - 第一种: 只能用在函数内部,而package级别的变量,禁止用这样的声明方式; - 第二种: