您好,登錄后才能下訂單哦!
終端讀寫
操作終端相關(guān)文件句柄常量
os.Stdin:標(biāo)準(zhǔn)輸入
os.Stdout:標(biāo)準(zhǔn)輸出
os.Stderr:標(biāo)準(zhǔn)錯誤輸出
終端讀寫示例:
//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 接受的是 只要實現(xiàn)的read接口
//帶緩沖區(qū)
//底層是代碼Reader 這個接口
type Reader interface {
Read(p []byte) (n int, err error)
}
帶緩沖區(qū)的讀寫代碼:
//NewReader需要接受實現(xiàn)Reader這個接口的實例
//os.Stidin底層實現(xiàn)了這個接口,所以能接受
read := bufio.NewReader(os.Stdin)
// 讀取每一行的字符,以\n為分割
line,err :=read.ReadString('\n')
if err!=nil{
fmt.Println("read eror",err)
return
}
fmt.Println("input!",line)
使用緩沖區(qū),把值輸出到終端上:
接口的強大
**自定義一個struct,然后實現(xiàn)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
}
栗子:統(tǒng)計終端輸入字符,數(shù)字,出現(xiàn)次數(shù)
package main import ( "fmt" "bufio" "os" ) func fusion_input(d string) { //一個utf-8字符占3個字節(jié) 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("英文字母的個數(shù):", countLetter) fmt.Println("數(shù)字的個數(shù):", countNum) fmt.Println("空格的個數(shù):", countSpace) // 這里理解為多了一個換行符,所以進行了減一 fmt.Println("其他字符的個數(shù):", countOther) } func main() { fmt.Println("Please...input:") read :=bufio.NewReader(os.Stdin) linebytes,_,_ := read.ReadLine() fusion_input(string(linebytes)) }
文件讀寫
可以定義一個const
const (
name = "E:/pycharm快捷鍵及一些常用設(shè)置.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快捷鍵及一些常用設(shè)置.txt")
fusion_error(err)
//文件打開,一定要defer 關(guān)閉,
defer file.Close()
var data [1024]byte
for {
//Read底層 接受的是一個bytes的切片
n,err := file.Read(data[:])
tag :=fusion_error(err)
if tag == false{
break
}
//獲取數(shù)據(jù)0到n直接的數(shù)據(jù), 這樣可以防止越界訪問,出現(xiàn)程序崩潰
filestr := string(data[0:n])
fmt.Println(filestr)
}
}
2.帶緩沖區(qū)的讀文件
//帶緩沖區(qū)的讀文件
func buffio_readfile(name string) {
file,err := os.Open(name)
fusion_error(err)
defer file.Close()
//bufio 更高級的功能, 可以按行讀
//bufio 封裝了一層
//帶緩沖區(qū),所以效率更高
//bufio 是接受的具體實現(xiàn)的接口 :實現(xiàn)了Reader 接口
reader := bufio.NewReader(file)
for {
line,err :=reader.ReadString('\n')
tag := fusion_error(err)
if tag == false{
break
}
fmt.Println(line)
}
}
3.一次性讀取文件內(nèi)容
//一次性讀出來放到內(nèi)存中!適合讀取配置文件
//內(nèi)部給你做了所有的操作,無需要關(guān)閉文件
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.寫文件操作
文件打開模式,第二個參數(shù)
os.O_WRONLY:只寫
os.O_CREATE:創(chuàng)建?件
os.O_RDONLY:只讀
os.O_RDWR:讀寫
os.O_TRUNC :清空
第三個參數(shù):權(quán)限控制
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 寫內(nèi)容,快
outputWriter :=bufio.NewWriter(file)
for i:=0;i<10;i++{
outputWriter.WriteString(fmt.Sprintf("hello %d\n",i))
}
//把內(nèi)存中的數(shù)據(jù)刷新進去
outputWriter.Flush()
}
6,文件內(nèi)容的Copy
//copy文件內(nèi)容
func Copyfile(dstName,srcName string) (written int64,err error) {
//dstName 目標(biāo)文件
//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.把文件內(nèi)容輸出到屏幕上
package main
import (
"os"
"fmt"
"io"
)
func cat(filename string) {
file,error :=os.Open(filename)
defer file.Close()
if error != nil{
fmt.Println("---")
return
}
//把文件內(nèi)容輸出到屏幕上
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.帶緩沖區(qū)的終端讀寫
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()
}
命令行參數(shù)
os.Args是一個string的切片,用來存儲所有的命令行參數(shù)
package main
//命令行參數(shù)
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 是一個數(shù)組
//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 會默認(rèn)把init中你配置的項都列出來
//終端操作:cmd_arg.exe -C "e:/DREAM/TEST" -L 5
}
Json序列化/反序列化
Json數(shù)據(jù)協(xié)議
1. 導(dǎo)入包: Import “encoding/json”
2. 序列化: json.Marshal(data interface{})
3. 反序列化: json.UnMarshal(data []byte, v interface{})
package main import ( "fmt" "math/rand" "encoding/json" "os" "io/ioutil" ) type Student struct { //字段必須大寫, 如果小寫的話,其他包是讀取不到 Name string `json:"name"` Age int `json:"age"` Score float32 `json:"score"` } func wirtefilejson() { var stus []*Student for i:=0;i<300;i++{ stu :=&Student{ Name:fmt.Sprintf("stu%d",i), Age:rand.Intn(100), Score:rand.Float32() * 100, } stus = append(stus,stu) } data,error := json.Marshal(stus) if error!=nil{ fmt.Printf("json faile,err:%v\n",error) return } file,error := os.OpenFile("D:/stu.txt",os.O_CREATE|os.O_WRONLY,0664) if error!=nil{ fmt.Printf("OpenFile error :%v\n",error) return } defer file.Close() n,error := file.Write(data) if error!=nil{ fmt.Printf("OpenFile error :%v\n",error) return } fmt.Printf("wirte %d, success \n",n) } func readfilejson() { file,err :=os.OpenFile("D:/stu.txt",os.O_RDONLY,0664) if err!=nil{ fmt.Printf("file failed err %v",err) } defer file.Close() data,err :=ioutil.ReadAll(file) if err!=nil{ fmt.Printf("read failed err %v",err) } var stus []*Student err = json.Unmarshal(data,&stus) if err!=nil{ fmt.Printf("JSON unmarshal failed err %v",err) } for i:=0;i<10;i++{ fmt.Printf("student:%#v\n",stus[i]) } } func main(){ //wirtefilejson() readfilejson() }
Panic捕獲
package main import ( "fmt" "time" ) func set( p *int) { *p = 123 } func test() { defer func() { err :=recover() if err != nil{ fmt.Println("panic:%v\n",err) } }() var p *int //因為設(shè)置p為指針,還需要new來分配內(nèi)存,,但是這里沒有set的就會出錯 //p = new(int) set(p) fmt.Printf("*p=%d\n",*p) } func main() { for { test() time.Sleep(time.Second) } }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。