1.2 命令行参数

切片

go语言采用左闭右开的方式,即区间包括第一个索引元素,不包括最后一个。因为这样可以简化逻辑。

  • 比如,a=[1,2,3,4],a[0:3]=[1,2,3],不包含最后一个元素。
  • 比如s[m:n]这个切片,0 <= m <= n <= len(s),包含n-m个元素,产生第m个元素到第n-1元素的切片。

echo 1.0

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

这个程序很简单,书中指出当参数庞大时,这种写法开销很大。

echo 1.1

使用strings包的Join函数

func main(){
  fmt.Println(strings.Join(os.Args[1:]," "))
}

练习1.1

import (
    "fmt"
    "os"
    "strings"
)

func main(){
    fmt.Println(strings.Join(os.Args[:]," "))
}

练习1.2

import (
    "fmt"
    "os"
)

func main(){
    for seq,i := range os.Args[1:]{
        fmt.Println(seq,i)
    }
}

练习1.3

package main

import (
    "strconv"
    "strings"
    "time"
    "fmt"
)

type myfunction struct {
    limit int
}

func (this myfunction)level()[]string{
    var col []string
    for i:=0;i<this.limit;i++{
        square := i * i
        col = append(col,strconv.FormatInt(int64(square),10))
    }
    return col
}

func (this myfunction)high(){
    strings.Join(this.level()," ")
}

func (this myfunction)low(){
    var s string
    for _,i := range this.level(){
        s += i
        s += " "
    }
}

func main(){
    m := myfunction{limit:100000}
    ctime := time.Now().Unix()
    m.high()
    fmt.Println("high",time.Now().Unix() - ctime)
    ctime_low := time.Now().Unix()
    m.low()
    fmt.Println("low",time.Now().Unix() - ctime_low)
}

本来想用装饰器模式精简一下代码,可是我不会写。
用goland来跑,high在0秒以内,low用了65秒,差异确实很大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容