Go 语言编程实例(八)

本节主要分享:文件读取、文件写入、线过滤器、命令行参数、命令行标识

以下代码在存放于github中如下仓库:github

Go 文件读取

程序的基本功能之一就是文件的操作,这里提供一个思路是Go 读取文件,文件读取时候需要进行错误判断。

package main

import (
    "io/ioutil"
    "fmt"
    "os"
    "bufio"
)

// 读取文件需要检查大多数的调用错误
// 这个函数帮助简化错误检查

func check(e error){
    if e != nil {
        panic(e)
    }
}


func main(){
    //最基本的文件读取到内存中
    dat , err := ioutil.ReadFile("test.log")
    check(err)
    fmt.Print(string(dat))

    //通过得到文件句柄值,可以更好的控制文件的读取。
    f,err := os.Open("test.log")
    check(err)

    //读取到一个5字节的数组中
    b1 := make([]byte,5)
    n1,err:=f.Read(b1)
    check(err)
    fmt.Printf("%d bytes: %s\n",n1,string(b1))

    //找到一个已知位置然后读取
    o2 , err := f.Seek(5,0)
    check(err)
    b2 := make([]byte,2)
    n2,err := f.Read(b2)
    check(err)
    fmt.Printf("%d bytes @ %d: %s\n",n2,o2,string(b2))

    //没有内置的倒带,但是 Seek(0,0) 可以实现这一点
    _,err = f.Seek(0,0)
    check(err)

    //bufio 包提供了一个缓冲的读取器,因为它具有许多小文件读取的效率,并且提供了额外的读取方式
    //适当使用可以提到程序性能。
    r4 := bufio.NewReader(f)
    b4,err := r4.Peek(5)
    check(err)
    fmt.Printf("5 bytes: %s\n",string(b4))

    //关闭文件
    f.Close()
}

Go 文件写入实例

在Go中文件的读取和写入模式类似。写入文件同样需要检查大多数的调用错误。

package main

import (
    "io/ioutil"
    "os"
    "fmt"
    "bufio"
)

func check(e error){
    if e != nil {
        panic(e)
    }
}

func main(){
    //写入一个字符串到文件中
    d1 := []byte("hello \n go \n")
    err := ioutil.WriteFile("write_test.txt",d1,0644)
    check(err)

    //打开文件并写入数据(更为精细的调用)
    f ,err := os.Create("write_test2.txt")
    check(err)

    //打开文件后一般操作就是立即推迟关闭文件
    defer f.Close()

    //按照预期的方式写入字节片段
    d2 := []byte{115,111,109,101,10}
    n2,err := f.Write(d2)
    check(err)
    fmt.Printf("Write %d bytes \n",n2)

    //写入字符串
    n3 , err := f.WriteString("writes \n")
    fmt.Printf("write %d bytes \n",n3)

    //刷新缓冲,保证数据写到硬盘中去了
    f.Sync()

    //bufio 提高文件读写性能
    w := bufio.NewWriter(f)
    n4,err:=w.WriteString("buffered\n")
    fmt.Printf("write %d bytes\n",n4)

    w.Flush()
}

Go 行过滤器实例

线过滤器是一种常见的程序,它读取 stdin 上的输入,处理它,然后将一些派生结果打印到 stdout 。 grepsed是常见的线过滤器。

package main

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

func main(){
    //用缓冲扫描包装无缓冲的 os.Stdin 可以让我们方便的扫描方法使扫描仪进入下一标记,
    //这是默认扫描器中的下一行。
    scanner := bufio.NewScanner(os.Stdin)

    for scanner.Scan(){
        // `Text` 返回当前标记,从输入来说这里是下一行
        ucl := strings.ToUpper(scanner.Text())
        //写出上面的行
        fmt.Println(ucl)
    }

    //检查扫描期间的错误。文件结束是预期的,不会被 scan 报告为错误。
    if err := scanner.Err(); err != nil {
        fmt.Println(os.Stderr,"error:",err)
        os.Exit(1)
    }
}

Go 命令行参数实例

命令行参数是参数化程序执行的常用方法。例如 : go run hello.gogohello.go 作为参数应用到 go 程序中。

os.Args 提供对原始命令行参数的访问。请注意,此切片中的第一个值是程序的路径,os.Args[1:] 保存程序的参数。可以正常索引单个 arg 值。

注意:运行一下程序建议在 cmd 中进行:

go run cmd_args.go 1 2 3 4 5
package main

import (
    "os"
    "fmt"
)

func main(){
    //os.Args 提供了原始命令行参数的访问
    argsWithProg := os.Args
    argsWithoutProg := os.Args[1:]

    //可以单独提取参数
    arg := os.Args[3]

    fmt.Println(argsWithoutProg)
    fmt.Println(argsWithProg)
    fmt.Println(arg)
}

Go 命令行标识实例

命令行标识是制定命令行程序选项的常用方法。例如,在 go build -ldflags abc ac.go ,其中 -ldflags 是命令行标识。Go 提供了一个支持基本命令行标识解析的标识标志包。如下示例:

import (
    "flag"
    "fmt"
)

func main(){
    //基本标志声明可用于字符串,整数和布尔选项。这里我们声明一个带有默认值
    //foo 的字符串标识 word 和一个简短的描述。这个 flag.String 函数一个字符串指针
    wordPtr := flag.String("word","foo","a string")

    //声明 numb 和 fork标识,使用和word标识相同的方法
    numbPtr := flag.Int("numb",42,"an int")
    boolPtr := flag.Bool("fork",false,"a bool")

    //还可以声明一个使用在程序中其他地方声明的现有变量的选项。
    //我们需要传递一个指向标识声明的函数指针
    var svar string
    flag.StringVar(&svar,"svar","bar","a string var")

    //一旦所有的标识都声明好了,就可以解析了
    flag.Parse()


    //显示消息
    fmt.Println("word:",*wordPtr)
    fmt.Println("numb:",*numbPtr)
    fmt.Println("fork",*boolPtr)
    fmt.Println("svar:",svar)
    fmt.Println("tail",flag.Args())
}

操作输出如下:

C:\Go\MyGo\src\lesson8_file>go build cmd_flags.go

C:\Go\MyGo\src\lesson8_file>cmd_flags.exe -word=ckl -numb=05202235 -fork -svar=flag
word: ckl
numb: 1377437
fork true
svar: flag
tail []

如需进一步讨论可以加群:295023494(嵌入式)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,161评论 2 33
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,404评论 0 17
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,807评论 6 342
  • 她是 生性无知的猫咪 她有 知己好友 三两只 她说 人生百态 恕不知 她说 交往处事 自不知 她说 开怀大笑 因阳...
    文君女神阅读 146评论 0 0