Go(day7 [终端读写| 文件操作 | 命令行参数 | Json序列化])

终端读写

操作终端相关文件句柄常量

  1. os.Stdin:标准输入
  2. os.Stdout:标准输出
  3. os.Stderr:标准错误输出

终端读写示例:

//Sscanf 是从变量中读取值

package main

import "fmt"

var (

firstName,lastName ,s string

i int

f float32

input = "56.12 / 5212 / Go"

format  = "%f/%d/%s"

)

func main()  {

fmt.Println("Please...input:")

fmt.Scanln(&firstName,&lastName)

fmt.Printf("Hi,%s,%s! \n",firstName,lastName)

fmt.Sscanf(input,format,&f,&i,&s)

fmt.Println("Form the string we read;",f,i,s)

}

牛逼的带缓冲的终端读写

//NewReader 接受的是 只要实现的read接口

//带缓冲区

//底层是代码Reader 这个接口

type Reader interface {

Read(p []byte) (n int, err error)

}

带缓冲区的读写代码:

//NewReader需要接受实现Reader这个接口的实例

//os.Stidin底层实现了这个接口,所以能接受

read := bufio.NewReader(os.Stdin)

// 读取每一行的字符,以\n为分割

line,err :=read.ReadString('\n')

if err!=nil{

fmt.Println("read eror",err)

return

}

fmt.Println("input!",line)

使用缓冲区,把值输出到终端上:

接口的强大
**自定义一个struct,然后实现Read接口****

type RandStr struct {

}

func (r *RandStr) Read(p []byte) (n int, err error) {

fmt.Printf("len(p)=%d\n",len(p))

source := "abcdefaskljdajhkldaload121332"

for i:=0;i<32;i++{

index := rand.Intn(len(source))

p[i] = source[index]

}

p[32] = '\n'

return len(p),nil

}

栗子:统计终端输入字符,数字,出现次数

package main

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

func fusion_input(d string)  {
    //一个utf-8字符占3个字节
    var countNum, countLetter, countSpace, countOther int
    utf8arr := []rune(d)
    for _, v := range utf8arr {
        if v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' {
            countLetter++
        } else if v >= '0' && v <= '9' {
            countNum++
        } else if v == ' ' {
            countSpace++
        } else {
            countOther++
        }
    }
    fmt.Println("英文字母的个数:", countLetter)
    fmt.Println("数字的个数:", countNum)
    fmt.Println("空格的个数:", countSpace)
    // 这里理解为多了一个换行符,所以进行了减一
    fmt.Println("其他字符的个数:", countOther)
}

func main()  {
    fmt.Println("Please...input:")
    read :=bufio.NewReader(os.Stdin)
    linebytes,_,_ := read.ReadLine()
    fusion_input(string(linebytes))

}

文件读写

可以定义一个const

const (

name = "E:/pycharm快捷键及一些常用设置.txt"

zipfilename ="C:/Users/Administrator/Documents/Tencent Files/1047738527/filenamepool.gz"

testwritefilename = "D:/Log.txt"

dstName = "E:/logger_helper.py"

srcName ="E:/jquery-1.12.4.js"

)

1:文件打开

func fusion_error(err error) bool {

var tag = true

if err == io.EOF{

fmt.Println("文件读完了")

return false

}

if err!=nil{

fmt.Printf("%s",err)

tag = false

return tag

}

return tag

}

//原生的打开文件

func testFile()  {

file,err := os.Open("E:/pycharm快捷键及一些常用设置.txt")

fusion_error(err)

//文件打开,一定要defer 关闭,

defer file.Close()

var data [1024]byte

for {

//Read底层 接受的是一个bytes的切片

n,err := file.Read(data[:])

tag :=fusion_error(err)

if tag == false{

break

}

//获取数据0到n直接的数据, 这样可以防止越界访问,出现程序崩溃

filestr := string(data[0:n])

fmt.Println(filestr)

}

}

2.带缓冲区的读文件

//带缓冲区的读文件

func buffio_readfile(name string)  {

file,err := os.Open(name)

fusion_error(err)

defer file.Close()

//bufio 更高级的功能, 可以按行读

//bufio 封装了一层

//带缓冲区,所以效率更高

//bufio 是接受的具体实现的接口 :实现了Reader 接口

reader := bufio.NewReader(file)

for {

line,err :=reader.ReadString('\n')

tag := fusion_error(err)

if tag == false{

break

}

fmt.Println(line)

}

}

3.一次性读取文件内容

//一次性读出来放到内存中!适合读取配置文件

//内部给你做了所有的操作,无需要关闭文件

func Ioutil(name string)  {

data,error :=ioutil.ReadFile(name)

fusion_error(error)

fmt.Println(string(data))

}

4.读取压缩文件:

//读取解压文件

func zipfile( name string)  {

file,error := os.Open(name)

fusion_error(error)

defer file.Close()

reader,error := gzip.NewReader(file)

fusion_error(error)

bufread := bufio.NewReader(reader)

for {

line,error:=bufread.ReadString('\n')

tag :=fusion_error(error)

if tag == false{

break

}

fmt.Printf("%s",line)

}

}

5.写文件操作

文件打开模式,第二个参数

  1. os.O_WRONLY:只写
  2. os.O_CREATE:创建?件
  3. os.O_RDONLY:只读
  4. os.O_RDWR读写
  5. os.O_TRUNC :清空

第三个参数:权限控制

r ——> 004
w——> 002
x——> 001


//写文件 :普通读写,缓存读写

func testWriteFile(name string)  {

file,err := os.OpenFile(name,os.O_WRONLY|os.O_CREATE,066)

fusion_error(err)

defer file.Close()

//普通的写文件操作,比较慢

//for i:=0;i<10;i++{

//  file.WriteString(fmt.Sprintf("hello %d\n",i))

//  file.WriteString("ceshi!!")

//}

//bufio 写内容,快

outputWriter :=bufio.NewWriter(file)

for i:=0;i<10;i++{

outputWriter.WriteString(fmt.Sprintf("hello %d\n",i))

}

//把内存中的数据刷新进去

outputWriter.Flush()

}

6,文件内容的Copy

//copy文件内容

func Copyfile(dstName,srcName string) (written int64,err error)  {

//dstName 目标文件

//srcName 源文件

src,err :=os.Open(srcName)

fusion_error(err)

defer src.Close()

dst,err :=os.OpenFile(dstName,os.O_WRONLY|os.O_CREATE,0644)

fusion_error(err)

defer dst.Close()

return io.Copy(dst,src)

}

7.把文件内容输出到屏幕上

package main

import (

"os"

"fmt"

"io"

)

func cat(filename string)  {

file,error :=os.Open(filename)

defer  file.Close()

if error != nil{

fmt.Println("---")

return

}

//把文件内容输出到屏幕上

io.Copy(os.Stdout,file)

}

func main()  {

if (len(os.Args) == 1 ){

fmt.Println("请指定文件名")

}

for i :=1;i<len(os.Args);i++{

cat(os.Args[i])

}

}

8.带缓冲区的终端读写

package main

import (

"bufio"

"fmt"

"os"

)

func main() {

fmt.Fprintf(os.Stdout, "%s\n", "hello world! - unbuffered")

buf := bufio.NewWriter(os.Stdout)

fmt.Fprintf(buf, "%s\n", "hello world! - buffered")

buf.Flush()

}

命令行参数

os.Args是一个string的切片,用来存储所有的命令行参数

package main

//命令行参数

import (

//"os"

"fmt"

"flag"

)

var (

conf string

level int

)

func init()  {

flag.StringVar(&conf,"C","D:/test.conf","请指定配置文件路径")

flag.IntVar(&level,"L",8,"请指定日志级别")

flag.Parse()

}

func main()  {

//获取终端输入的值:os.Args 是一个数组

//for index,val := range os.Args{

//  fmt.Printf("arg:[%d] = %s\n",index,val)

//

//}

fmt.Printf("conf is :%s\n",conf)

fmt.Printf("level is :%d\n",level)

//-h 会默认把init中你配置的项都列出来

//终端操作:cmd_arg.exe -C "e:/DREAM/TEST" -L 5

}

Json序列化/反序列化

Json数据协议

1. 导入包: Import “encoding/json”
2. 序列化: json.Marshal(data interface{})
3. 反序列化: json.UnMarshal(data []byte, v interface{})

原文地址:http://blog.51cto.com/12765315/2060881

时间: 2024-08-23 09:50:26

Go(day7 [终端读写| 文件操作 | 命令行参数 | Json序列化])的相关文章

go语言之行--文件操作、命令行参数、序列化与反序列化详解

一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: 标准输入 os.Stdout: 标准输出 os.Stderr: 标准错误输出 读写示例: package main import ( "fmt" "os" ) var( username,password string ) func main() { fmt.Prin

学习使用的PL/0编译器增强版PL/0plusplusCompiler(二)加入支持命令行参数

每次程序运行后输入源码文件名不是很好,于是做了支持命令行参数的改进.大体思路:在main函数入口加入命令行参数,进入main后判断文件名是否为空,为空就退出,否则就继续编译. 在main的括号中加入 int argc, char** argv 在main第一行加入 /*如果没有在命令行中输入文件名会提示输入源码文件名*/ if(argv[1]==NULL){ printf("请输入源程序!\n"); return; } 把这两行注释掉 // printf("Input pl/

Linux查找并删除重复文件的命令行fdupes工具,dupeGuru图形工具

查了几十个网页,找到这个接近满意的解决方案http://unix.stackexchange.com/questions/146197/fdupes-delete-files-aft... 不过正则里面的叹号好像不能起到清除空行的效果,改为d;fdupes --recurse A/ B/ | sed '/^A/d; /^$/d; s/.*/"&"/' | xargs rm 但还有个小问题,如果A里面有重复的文件,但这文件不在B中,fdupes也是会列为结果,导致误删,要再想想

识别Mac电脑上文件的命令行技巧

原文链接:File it away 有时你会因一个文件而迷惑,这个文件可能是在你的文件夹中的一个未知类型的文件,它可能是你的父母或者客户给你的.不幸的是,你不知道它到底是一种什么样的文件.在Mac上文件是不带有拓展名的,所以可能并没有足够的信息来告诉你"Flongnozzle-2012"到底包含了什么内容.然而终端(Terminal)可以为你提供一些便利,你可以使用一些内嵌的命令行工具来帮助你鉴别文件. 识别文件内容 对于这种情况,file命令恰好是我所需要的.file指令可以检测一个

Go 终端读写 &amp;&amp; 文件读写

终端读写 操作终端相关文件句柄常量 os.Stdin(standard):标准输入 os.Stdout:标准输出 os.Stderr:标准错误输出 标准输出 demo:直接输出和 判断之后输出的结果不一致 func main(){ //标准输出接口, 格式, 需要格式化的内容 fmt.Fprintf(os.Stdout, "%s\n", "hello world ~") fmt.Fprintln(os.Stdout, "hello, world ~&quo

如何编写一个带命令行参数的Python文件

看到别人执行一个支持命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持命令行参数. 首先你要知道python中的sys模块的一些功能: import sys print "the number of python program's argument:",len(sys.argv) print "the value of every argument

4.1 对每个命令行参数打印文件类型

file/filetype.c #include "apue.h" int main(int argc, char *argv[]) { int i; struct stat buf; char *ptr; for (i = 1; i < argc; i++) { printf("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0) { err_ret("lstat error"); c

python 文件处理 -- 02 文件属性&amp;标准输入输出&amp;命令行参数&amp;文件编码

1文件属性 file.fileno()--文件描述符 file.mode--文件当前打开的权限 file.encoding--文件编码格式(无输出表明为ASCII码) file.closed--文件是否被关闭 >>> f.fileno() 3 >>> f.mode 'r+' >>> f.encoding >>> f.closed False >>> filter(lambda s:s[:2]!='__',dir(f)

pyton终端输出带颜色的命令行

pyton终端输出带颜色的命令行 1''' 2也就三个知识点 31.可以设置前景色,但是不能设置背景色 42.可以设置背景色,但是前景色只能是黑色 53.可以设置效果 6    1. 0 终端默认显示状态,加不加无影响 7    2. 1 高亮显示时,可以设置前景色与背景色,如果设置前景色,背景色默认为黑色,如果设置背景色,前景色默认为白色 8    3. 4 添加下划线,下划线跟随前景色 9    4. 7 设置反白显示,会出现设置前景色后,前景色为白色,而设置背景色后,显示效果无变化,前景色