最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang實現(xiàn)IO操作

 更新時間:2024年05月14日 08:29:01   作者:兩片空白  
本文主要介紹了Golang實現(xiàn)IO操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 輸入輸出的底層原理

終端其實是一個文件(Linux下一切皆文件),相關(guān)實例如下:

  • os.Stdin:標(biāo)準(zhǔn)輸出的文件實例,類型為*File
  • os.Stdout:標(biāo)準(zhǔn)輸入的文件實例,類型為*File
  • os.Stderr:標(biāo)準(zhǔn)錯誤輸出的文件實例,類型為*File

以文件方式操作終端:

package main

import (
	"os"
)

func main() {
	var buf []byte
	os.Stdin.Read(buf[:])             //從標(biāo)準(zhǔn)輸入中讀取
	os.Stdin.WriteString(string(buf)) //寫入標(biāo)準(zhǔn)輸入
}

2. 文件操作相關(guān)API 

根據(jù)提供的文件名創(chuàng)建新的文件,返回一個文件對象,默認(rèn)權(quán)限0666,任何人可讀可寫,不可執(zhí)行,如果文件存在,則會截斷它(為空文件),如果成功,返回的文件對象可用于I/O;對應(yīng)的文件描述符具有O_RDWR模式。如果出錯,錯誤底層類型是*PathError。

func Create(name string) (file *File, err error)

NewFile使用給出的Unix文件描述符和名稱創(chuàng)建一個文件。 

func NewFile(fd uintptr, name string) *File

只讀方式打開一個名稱為name文件。

func Open(name string) (file *File, err error)

打開一個名為name的文件,flag是打開方式,只讀或只寫,不存在創(chuàng)建等,perm文件權(quán)限。 

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

在指定位置(相對于文件起始位置),寫入byte類型的數(shù)據(jù)到文件,它返回寫入的字節(jié)數(shù)和可能遇到的任何錯誤。如果返回值n!=len(b),本方法會返回一個非nil的錯誤。

func (f *File) WriteAt(b []byte, off int64) (n int, err error)

向文件中寫入string類型的信息到文件。

func (f *File) WriteString(s string) (ret int, err error)

從f中讀取最多l(xiāng)en(b)字節(jié)數(shù)的數(shù)據(jù)到b。

func (f *File) Read(b []byte) (n int, err error)

從f的指定位置(相對于文件起始位置),讀取len(b)字節(jié)數(shù)并寫入b。

func (f *File) ReadAt(b []byte, off int64) (n int, err error)

刪除name指定的文件或目錄。

func Remove(name string) error

 3. 打開和關(guān)閉文件

os.Open()函數(shù)能夠打開一個文件,返回一個*File和一個err。對得到的文件實例調(diào)用close()方法能夠關(guān)閉文件。

package main

import (
	"log"
	"os"
)

func main() {
	//只讀的方式打開文件
	f, err := os.Open("./main.go")
	if err != nil {
		log.Println("open main.go file fail")
		return
	}
	//關(guān)閉文件
	defer f.Close()
}

4. 寫文件

package main

import (
	"log"
	"os"
)

func main() {
	//可讀可寫的方式創(chuàng)建一個文件
	f, err := os.Create("./xx.txt")
	if err != nil {
		log.Println("create file fail")
		return
	}
	defer f.Close()

	for i := 0; i < 5; i++ {
		f.Write([]byte("ab\n"))
		f.WriteString("ab\n")
	}
}

5. 讀文件

文件讀取可以用file.Read()和file.ReadAt(),讀到文件末尾會返回io.EOF的錯誤。

package main

import (
	"fmt"
	"io"
	"log"
	"os"
)

func main() {
	f, err := os.Open("./xx.txt")
	if err != nil {
		log.Println("open file fail")
		return
	}
	defer f.Close()

	var content []byte
	for {
		var buf [128]byte
		n, err := f.Read(buf[:])
		if err == io.EOF {
			//讀到文件末尾
			break
		}
		if err != nil {
			log.Println("Read file fail", err)
			return
		}
		content = append(content, buf[:n]...) //buf[:n]切片被打散傳入
	}
	fmt.Println(string(content))
}

“…”的用法:三個點“...”其實是go的一種語法糖(糖衣語法)

  • 第一個用法主要是用于函數(shù)有多個不定參數(shù)的情況,表示為可變參數(shù),可以接受任意個數(shù)但相同類型的參數(shù)。
  • 第二個用法是slice可以被打散進行傳遞。

 6. 拷貝文件

package main

import (
	"io"
	"log"
	"os"
)

func main() {
	f1, err := os.Open("./xx.txt")
	if err != nil {
		log.Println("open xx.txt file fail", err)
		return
	}
	defer f1.Close()
	f2, err := os.Create("./abc.txt")
	if err != nil {
		log.Println("create file fail ", err)
		return
	}
	defer f2.Close()

	for {
		var buf [128]byte
		n, err := f1.Read(buf[:])
		if err == io.EOF {
			log.Println("讀取完畢")
			break
		}
		if err != nil {
			return
		}

		f2.Write(buf[:n])
	}
}

7. bufio

  • bufio包實現(xiàn)了帶緩沖區(qū)的讀寫,是對文件讀寫的封裝。
  • bufio緩沖寫數(shù)據(jù)。

  • bufio讀數(shù)據(jù) ,bufio先把數(shù)據(jù)讀/寫到緩沖區(qū),達到某一上限,會刷新到文件中,也可以強制刷新。
package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
)

func wr() {
	f, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0664)
	if err != nil {
		log.Println("open file fail ", err)
		return
	}
	defer f.Close()
    //獲取writer對象
	writer := bufio.NewWriter(f)
	for i := 0; i < 5; i++ {
		writer.WriteString("hello\n")
	}
	//刷新緩沖區(qū),強制寫入
	writer.Flush()
}

func rd() {
	f, err := os.Open("./xxx.txt")
	if err != nil {
		log.Println("open file fail")
		return
	}
	defer f.Close()

    //獲取reader對象
	reader := bufio.NewReader(f)
	var content []byte
	for {
		line, _, err := reader.ReadLine()
		if err == io.EOF {
			log.Println("讀取完畢")
			break
		}
		if err != nil {
			return
		}
		content = append(content, line...)
	}
	fmt.Println(string(content))
}

func main() {
	wr()
	rd()
}

8. ioutil工具包

  • 工具包寫文件
  • 工具包讀文件
package main

import (
	"fmt"
	"io/ioutil"
	"log"
)

func wr() {
	err := ioutil.WriteFile("./xxxx.txt", []byte("hello world!"), 0666)
	if err != nil {
		log.Println("err")
		return
	}
}

func rd() {
	data, err := ioutil.ReadFile("./xxxx.txt")
	if err != nil {
		log.Println("err")
		return
	}
	fmt.Println(string(data))
}

func main() {
	wr()
	rd()
}

9. 例子

        實現(xiàn)cat命令

package main

import (
	"bufio"
	"flag"
	"fmt"
	"io"
	"log"
	"os"
)

func cat(reader *bufio.Reader) {
	for {
		buf, err := reader.ReadBytes('\n') //注意是字符
		if err == io.EOF {
			break
		}
		fmt.Fprintf(os.Stdout, "%s", string(buf))
	}
}

func main() {
	flag.Parse()
	if flag.NArg() == 0 {
		cat(bufio.NewReader(os.Stdin))
	} else {
		for i := 0; i &lt; flag.NArg(); i++ {
			f, err := os.Open(flag.Arg(i))
			if err != nil {
				log.Printf("open file %s fail, err %v\n", flag.Arg(i), err)
				continue
			}
			cat(bufio.NewReader(f))
			f.Close()
		}
	}
}

到此這篇關(guān)于Golang實現(xiàn)IO操作的文章就介紹到這了,更多相關(guān)Golang IO操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言并發(fā)之原子操作詳解

    Go語言并發(fā)之原子操作詳解

    代碼中的加鎖操作因為涉及內(nèi)核態(tài)的上下文切換會比較耗時、代價比較高。針對基本數(shù)據(jù)類型我們還可以使用原子操作來保證并發(fā)安全,本文就來和大家詳細(xì)聊聊,需要的可以參考下
    2022-12-12
  • 詳解Go中g(shù)in框架如何實現(xiàn)帶顏色日志

    詳解Go中g(shù)in框架如何實現(xiàn)帶顏色日志

    當(dāng)我們在終端上(比如Goland)運行g(shù)in框架搭建的服務(wù)時,會發(fā)現(xiàn)輸出的日志是可以帶顏色的,那這是如何實現(xiàn)的呢?本文就來和大家簡單講講
    2023-04-04
  • golang判斷chan channel是否關(guān)閉的方法

    golang判斷chan channel是否關(guān)閉的方法

    這篇文章主要介紹了golang判斷chan channel是否關(guān)閉的方法,結(jié)合實例形式對比分析了Go語言判斷chan沒有關(guān)閉的后果及關(guān)閉的方法,需要的朋友可以參考下
    2016-07-07
  • golang?chan傳遞數(shù)據(jù)的性能開銷詳解

    golang?chan傳遞數(shù)據(jù)的性能開銷詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中chan在接收和發(fā)送數(shù)據(jù)時因為“復(fù)制”而產(chǎn)生的開銷,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-01-01
  • Linux中Go環(huán)境配置和GoModule常用操作

    Linux中Go環(huán)境配置和GoModule常用操作

    這篇文章主要介紹了Linux中Go環(huán)境配置和GoModule,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)

    Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)

    本文主要介紹了Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    這篇文章主要介紹了Go 高效截取字符串的一些思考,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • golang中sync.Map并發(fā)創(chuàng)建、讀取問題實戰(zhàn)記錄

    golang中sync.Map并發(fā)創(chuàng)建、讀取問題實戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于golang中sync.Map并發(fā)創(chuàng)建、讀取問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • golang http連接復(fù)用方法

    golang http連接復(fù)用方法

    今天小編就為大家分享一篇golang http連接復(fù)用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 解決Go語言數(shù)據(jù)庫中null值的問題

    解決Go語言數(shù)據(jù)庫中null值的問題

    這篇文章主要介紹了解決Go語言數(shù)據(jù)庫中null值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

彰化县| 汉沽区| 钟祥市| 新野县| 秦皇岛市| 和林格尔县| 偏关县| 贵港市| 鹤壁市| 合山市| 准格尔旗| 乌恰县| 长兴县| 通渭县| 开封县| 高邮市| 宁南县| 芜湖市| 札达县| 吴桥县| 鄂托克前旗| 循化| 原平市| 清徐县| 广饶县| 来凤县| 鄂伦春自治旗| 赣州市| 鹰潭市| 铜梁县| 鄂伦春自治旗| 刚察县| 安平县| 安庆市| 宜川县| 临沭县| 阳朔县| 达拉特旗| 莱西市| 长子县| 乌鲁木齐县|