八、golang文本操作、json协议

一、终端读写

操作终端相关文件语句常量,go所有的都是接口

os.Stdin:标准输入

os.Stdout:标准输入,只要实现输出这个接口,打印到终端,

os.Stderr:标准错误输出

os.OpenFile(“路径”,模式):打开文件

终端读写实例

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 enter your full name”)   //打印一行的输出

fmt.Scanln(&firstName,&lastName)           //只能输入字符串

//fmt.Scanf(input,format,&f,&I,&s)            //格式化输入

fmt.Printf()                               //格式化输出

fmt.Sscanf(input,format,&f,&I,&s)            //从一个字符串中格式化输入

fmt.Println(“from the we read ”,f,I,s)

}

复制代码
package main

import "fmt"

type Student struct{
   Name string
   Age int
   Score float32
}

func main(){
   var str ="stu01 18 89.92"
   var stu Student
   fmt.Sscanf(str,"%s %d %f",&stu.Name,&stu.Age,stu.Score)
   fmt.Println(stu)
}
{stu01 18 0}
上面就是把str字符串中的内容格式化输入到了stu这个结构体中
View Code
复制代码

带缓冲区的读写    从终端去读取数据

首先写道缓冲区里面,然后go或者系统再刷到文件里面,用于提高性能

下面是带缓冲区的读的代码  

小结:

1)用bufio.NewReader创建一个新的Reader,返回值默认大小的Reader,也就是创建缓冲区然后把文件读入缓冲区

2)然后根据上面的返回值进行Read。。。方法读取,返回错误和读出的数据

3)进行err判断

文件读写

open:返回一个文件用于读取数据

OpenFile:如果需要读写 操作用这个

练习:从文件中读取一行字符串,统计英文、数字、空格以及其他字符的数量

读取到文件末尾会返回io.EOF这个错误

  

1、os.File封装所有文件相关操作,之间的os.Stdin,os.Stdout,os.Stderr都是*os.File(结构体)

a)打开一个文件进行读操作  os.Open(name string)(*File,error)  //第一个括号是全路径,返回file

b)关闭一个文件:File.Close()

如果不关闭的话,linux最大为65535个文件句柄,如果超过最大数的话,那么以后再打的时候就一直是失败的

io/ioutil这个文件包可以一下把文件全部读取出来,读取到缓冲区里面

bufio这个包是一行一行把文件读取到缓冲区里面

 

读取整个文件实例

读取压缩文件

gzip.NewReader()参数接受一个文件句柄,读一部分文件数据解压缩,返回值是一个具有解压缩的功能

再把上面的具有解压缩的返回值放入到缓冲区里面,返回值为带缓冲区的解压缩功能

复制代码
package main

import (
   "bufio"
   "os"
   "fmt"
   "compress/gzip"
)

func main(){
   fName:="myFile.gz"
   var r *bufio.Reader
   fi,err:=os.Open(fName)          //打开文件
   if err!=nil{
      fmt.Fprintf(os.Stderr,"%v can`t open %s:error:%s\n",os.Args[0],fName,err)
      os.Exit(1)
   }
   defer fi.Close()               //关闭文件
   fz,err:=gzip.NewReader(fi)     //创建fi大小的缓冲区进行解压
   if err!=nil{
      fmt.Fprintf(os.Stderr,"open gizp failed err%v\n",err)
      return
   }
   r=bufio.NewReader(fz)          //创建一个为fz大小的缓冲区
   for{
      line,err:=r.ReadString('\n)   //在缓冲区内读取文件
      if err!=nil{
         fmt.Println("Done reading file")
         os.Exit()
      }
      fmt.Println(line)
   }
}


解压缩文件小结:
1)打开文件
2)创建需要解压缩文件大小的缓冲区进行解压文件
3)创造解压后文件大小的缓冲区
4)在缓冲区内读取文件
5)关闭文件
View Code
复制代码

文件写入:

os.OpenFile(“output.dat”,os.O_WRONLY|os.O_CREATE,0666)

第一个参数是文件路径,第二个参数是模式

第二个参数

1.os.O_WRONLY:只写

2,os.O_CREATE: 创建文件

3.os.O_RDONLY:只读

4.os.O_RDWR,读写

5.os.O_TRUNC:清空

12 14

第三个参数:权限控制

r--à04

w--à02

x--à01

这里第三个三处分别是属主,数组,其他人

复制代码
package main

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

func main(){
   outputFile,outputError:=os.OpenFile("output.da",os.O_WRONLY|os.O_CREATE,0666) //打开文件写
   if outputError != nil{
      fmt.Printf("An error occured with file crea ion!")
      return
   }
   defer outputFile.Close()
   outputWrite:=bufio.NewWriter(outputFile)   //创建一个写入文件大小的缓冲区
   outputString:="hello word \n"
   for i:=0;i<10;i++{
      outputWrite.WriteString(outputString)   //把数据写入到缓冲区
   }
   outputWrite.Flush()          //把缓冲区的数据刷入到磁盘中,防止数据丢失
}

写入文件小结:
1)打开文件设置权限以及方式
2)defer关闭文件
3)创建一个文件大小的缓冲区
4)把数据写入缓冲区
5)把缓冲区中的数据刷入到磁盘中
View Code
复制代码

拷贝文件

源码简单,根据接口来实现

看copy源码

复制代码
func Copy(dst Writer, src Reader) (written int64, err error) {
   return copyBuffer(dst, src, nil)
}

// CopyBuffer is identical to Copy except that it stages through the
// provided buffer (if one is required) rather than allocating a
// temporary one. If buf is nil, one is allocated; otherwise if it has
// zero length, CopyBuffer panics.
func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
   if buf != nil && len(buf) == 0 {
      panic("empty buffer in io.CopyBuffer")
   }
   return copyBuffer(dst, src, buf)
}

// copyBuffer is the actual implementation of Copy and CopyBuffer.
// if buf is nil, one is allocated.
func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
   // If the reader has a WriteTo method, use it to do the copy.
   // Avoids an allocation and a copy.
   if wt, ok := src.(WriterTo); ok {
      return wt.WriteTo(dst)
   }
   // Similarly, if the writer has a ReadFrom method, use it to do the copy.
   if rt, ok := dst.(ReaderFrom); ok {
      return rt.ReadFrom(src)
   }
   if buf == nil {              //32k为单位进行拷贝
      buf = make([]byte, 32*1024)
   }
   for {
      nr, er := src.Read(buf)           //首先读32k数据
      if nr > 0 {                     //读数据成功
         nw, ew := dst.Write(buf[0:nr]) //把把数据写入到目的文件之中
         if nw > 0 {
            written += int64(nw)         //写入
         }
         if ew != nil {                //
            err = ew
            break      
         }
         if nr != nw {                //如果读的和写的数据数量不相等
            err = ErrShortWrite       //返回错误
            break
         }
      }
      if er != nil {                  //文件读完的话
         if er != EOF {             //如果文件没有读到末尾
            err = er               //错误赋值
         }
         break
      }
   }
   return written, err
}
copy可以实现文件拷贝到另一个文件,也可以实现文件拷贝到终端,也可以实现文件拷贝到网络中
View Code
复制代码

带缓冲区的读写

 

JSON数据协议

 

go如果和其他语言有交互,那么就需要序列化为json字符串,然后通过网络传输传递给程序,然后反序列化为其他语言

1)导入包:Import “encoding/json”

2)序列化:json.Marshal(data interface{})

3)反序列化:json.UnMarshal(data []byte,v interface{})

 

Json序列化结构体

 

  

testMap()的结果

 

 

testSlice()的结果

 

 

 

 

 

 

 

testSlice()的结果

posted @   pi-pi-miao-miao  阅读(903)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
点击右上角即可分享
微信分享提示