Go xmas2020 全英課程 07 學習筆記、Formatted & File I/O

来源:https://www.cnblogs.com/linxiaoxu/archive/2022/04/04/16098735.html
-Advertisement-
Play Games

07-Formatted & File I/O、 I/O steams、 formatted I/O、 fmt functions、 file I/O、 Practice ① I/O、 Always check the err、 Practice ② I/O、 Pra... ...


課程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)

主講老師 Matt Holiday

image-20220401081031592

07-Formatted & File I/O

I/O steams

image-20220404094820605

操作系統具有三個標準 io 流,標準輸入、標準輸出、標準錯誤。它們分別可以重定向。


formatted I/O

image-20220404095050876

Println 將參數預設輸出到標準輸出流,如果會用 Fprintln 可以指定輸出到某個流,比如 os.Stderr


fmt functions

image-20220404095236836

Sprintln 格式化字元串並返回。

image-20220404095458035


package main

import "fmt"

func main() {
	a, b := 12, 345
	c, d := 1.2, 3.45

	fmt.Printf("%d %d\n", a, b)
	fmt.Printf("%x %x\n", a, b)
	fmt.Printf("%#x %#x\n", a, b)
	fmt.Printf("%f %.2f", c, d)
	fmt.Println()
	fmt.Printf("|%6d|%6d|\n", a, b)
	fmt.Printf("|%-6d|%-6d|\n", a, b)
	fmt.Printf("|%06d|%06d|\n", a, b)
	fmt.Printf("|%9f|%9.2f|\n", c, d) // ^ 當數字過大時也會超出
}
12 345
c 159
0xc 0x159
1.200000 3.45
|    12|   345|
|12    |345   |
|000012|000345|
| 1.200000|     3.45|

package main

import (
	"fmt"
)

func main() {
	s := []int{1, 2, 3}
	a := [3]rune{'a', 'b', 'c'}
	m := map[string]int{"and": 1, "or": 2}
	ss := "a string"
	b := []byte(ss)

	fmt.Printf("%T\n", s)
	fmt.Printf("%v\n", s)
	fmt.Printf("%#v\n", s) // ^ %#v 更符合初始化時輸入的形式
	fmt.Println()
	fmt.Printf("%T\n", a)
	fmt.Printf("%v\n", a)
	fmt.Printf("%q\n", a) // ^ 註意這個%q將rune從int32轉化成了字元串
	fmt.Printf("%#v\n", a)
	fmt.Println()
	fmt.Printf("%T\n", m)
	fmt.Printf("%v\n", m)
	fmt.Printf("%#v\n", m)
	fmt.Println()
	fmt.Printf("%T\n", ss)
	fmt.Printf("%v\n", ss)
	fmt.Printf("%q\n", ss)
	fmt.Printf("%#v\n", ss)
	fmt.Printf("%v\n", b)
	fmt.Printf("%v\n", string(b)) // ^ 將位元組切片轉換為字元串
}
[]int
[1 2 3]
[]int{1, 2, 3}

[3]int32
[97 98 99]
['a' 'b' 'c']
[3]int32{97, 98, 99}

map[string]int
map[and:1 or:2]
map[string]int{"and":1, "or":2}

string
a string
"a string"
"a string"
[97 32 115 116 114 105 110 103]
a string

file I/O

image-20220404102923944

Practice ① I/O

編寫一個類似 Unix cat 的程式,將多個文件輸出到標準輸出流中,並輸出為一個文件。

package main

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

func main() {
	for _, fname := range os.Args[1:] {
		file, err := os.Open(fname)

		if err != nil {
			fmt.Fprintln(os.Stderr, err)
			continue
		}
		if _, err := io.Copy(os.Stdout, file); err != nil {
			fmt.Fprint(os.Stderr, err)
			continue
		}
		fmt.Fprint(os.Stdout, "\n") // ^ 每個文件內容末尾添加換行符
		file.Close()
	}
}

io.copy 是一個很棒的功能,它知道如何緩衝、如何以塊的形式讀入並寫會,它不會嘗試把整個文件讀取到記憶體中也不會一次讀取一個字元。

file.Close 大多數操作系統對程式中打開多少個文件有限制,所以文件使用完成後需要進行關閉。

在當前目錄新建 txt 文件,寫入內容。執行下麵三條命令。

go run . a.txt
go run . a.txt b.txt c.txt
go run . a.txt b.txt c.txt > new.txt

第二條指令結果
[]int{1, 2, 3}
go go go
people car
cat
apple
banana

第三條指令在當前目錄生成了 new.txt 文件,內容是 標準輸出流 的內容。

image-20220404105436335

image-20220404105445902


Always check the err

image-20220404111400635

Practice ② I/O

編寫一個簡短的程式計算文件大小。一次性讀取(小文件情況下)

我們前面知道, io/ioutil 包可以對整個文件進行讀取,存入記憶體中。我們可以使用它計算文件大小。

原先的 io.Copy 返回的是複製的位元組數,而 ReadAll 將返回整個 data ,位元組切片和一個err。

package main

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

func main() {
	for _, fname := range os.Args[1:] {
		file, err := os.Open(fname)

		if err != nil {
			fmt.Fprintln(os.Stderr, err)
			continue
		}
		data, err := ioutil.ReadAll(file)
		if err != nil {
			fmt.Fprint(os.Stderr, err)
			continue
		}
		fmt.Println("The file has", len(data), "bytes")
		file.Close()
	}
}
go run . a.txt b.txt c.txt

The file has 30 bytes
The file has 20 bytes
The file has 18 bytes

data, err := ioutil.ReadAll(file)if 中取出單獨成行,是因為需要 data 這個變數。如果放在 if 短聲明裡會導致作用域只在 if 語句塊內。


Practice ③ I/O

編寫一個 wc 程式(word counter),輸出lines、words、characters數量。使用緩衝 buffio(大文件情況下)

package main

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

func main() {
	for _, fname := range os.Args[1:] {
		var lc, wc, cc int

		file, err := os.Open(fname)

		if err != nil {
			fmt.Fprintln(os.Stderr, err)
			continue
		}

		scan := bufio.NewScanner(file)

		for scan.Scan() {
			s := scan.Text()
			wc += len(strings.Fields(s)) // ^ 根據空格、製表符分割 a slice of words
			cc += len(s)
			lc++
		}

		fmt.Printf("%7d %7d %7d %s\n", lc, wc, cc, fname)
		file.Close()
	}
}
go run . a.txt b.txt c.txt

      3       7      26 a.txt
      2       5      18 b.txt
      3       3      14 c.txt

bufio.NewScanner(file) 創建一個掃描器按行掃描。考慮到多行需要用 for 迴圈 scan.Scan

strings.Fields(s) 根據空格、製表符分割,拿到的是字元串切片。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明 當前的版本為 MyBatis 3.5.9 MyBatis Plus 3.5.1 Spring Boot 2.6.4 Postgresql 42.3.3 與 Spring Boot 結合使用 MyBatis 以下說明Spring Boot下完全以註解方式進行的配置, 覆蓋大部分功能場景 項目依賴 ...
  • SpringBoot+vue練手項目 博客系統 項目使用技術 : springboot + mybatisplus+redis+mysql 1. 工程搭建 前端的工程地址: 鏈接:https://pan.baidu.com/s/1cg_11ctsbbq_WM9BnpcOaQ 提取碼:nrun npm ...
  • Java學習地址 視頻地址 真的很推薦大家去聽老韓的課(非常細誰聽誰知道):【零基礎 快速學Java】韓順平 零基礎30天學會Java_嗶哩嗶哩_bilibili 使用心得 說一下我使用的心得: 1. 學過C和C++,作為軟體工程的學生大一下學期的 Java 屬實是混過去的(60飄過),當我真正想開 ...
  • Spring Boot啟動流程 君生我未生,君生我已老。君恨我生遲,我恨君生早。 一、簡述 Spring Boot啟動流程分析使用版本SpringBoot VERSION:版本 2.5.5-SNAPSHOT。 Spring Boot項目最簡單的Application啟動類。 可以看出Applicat ...
  • 操作系統:Windows 10_x64 python版本:Python 3.9.2_x64 pyttsx3版本: 2.90 pyttsx3是一個tts引擎包裝器,可對接SAPI5、NSSS(NSSpeechSynthesizer)、espeak等引擎,實現統一的tts介面。 pyttsx3的地址:h ...
  • 引子 十幾年前,剛工作不久的程式員還能過著很輕鬆的日子。記得那時候公司里有些開發和測試的女孩子,經常有問題解決不了的,不管什麼領域的問題找到我,我都能幫她們解決。但是那時候我沒有主動學習技術的意識,只是滿足於解決問題,錯過了能力提升最好的階段。 老公是個截然相反的類型,我就看他天天在宿舍里學習。學來 ...
  • 本文實時更新原址:https://ebitencookbook.vercel.app/docs/CookBook_Start/class1 第一課 安裝 Ebiten 歡迎大家來到 Ebiten 中文教程. 今天我們正式開始學習Ebiten的開發. 安裝開發環境 也可以參照官方教程(中文文檔): h ...
  • 安裝pyinstaller,打包python文件 法一 1.打開Windows電腦的cmd(Windows+r)。 2.輸入 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller (這是順利的情況!) 我自己安裝的時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...