GO語言學習筆記(與Java的比較學習)(九)

讀寫數據

讀取用戶的輸入

最簡單的辦法是使用 fmt 包提供的 Scan 和 Sscan 開頭的函數。

Scanln 掃描來自標準輸入的文本,將空格分隔的值依次存放到后續的參數內,直到碰到換行。Scanf 與其類似,除了 Scanf 的第一個參數用作格式字符串,用來決定如何讀取。Sscan 和以 Sscan 開頭的函數則是從字符串讀取,除此之外,與 Scanf 相同。

package main
?
import "fmt"
?
var (firstName, lastName, s stringage, i ? ? ? ? ? ? ? ? intf ? ? ? ? ? ? ? ? ? ? ?float32input ? ? ? ? ? ? ? ? ?= "1 / 1.1 / aa"format ? ? ? ? ? ? ? ? = "%d / %f / %s"
)
?
func main() {println("Please enter your name: ")// 使用空格符分割的輸入fmt.Scanln(&firstName, &lastName)fmt.Printf("Hi %s %s!\n", firstName, lastName)println("Please enter your age: ")// 規范輸入格式的輸入fmt.Scanf("%d", &age)fmt.Printf("your age is %d\n", age)// 讀取指定字符串的內容fmt.Sscanf(input, format, &i, &f, &s)fmt.Println("From this string we can read: ", i, f, s)
}

文件讀寫

package main
import ("bufio""fmt""io""os"
)
?
func main() {inputFile, inputError := os.Open("input.dat")if inputError != nil {fmt.Printf("An error occurred on opening the inputfile\n" +"Does the file exist?\n" +"Have you got acces to it?\n")return // exit the function on error}defer inputFile.Close()
?inputReader := bufio.NewReader(inputFile)for {inputString, readerError := inputReader.ReadString('\n')fmt.Printf("The input was: %s", inputString)if readerError == io.EOF {return} ? ? ?}
}

文件拷貝

從命令行讀取參數

os 包

os 包中有一個 string 類型的切片變量 os.Args,用來處理一些基本的命令行參數,它在程序啟動后讀取命令行輸入的參數。

flag 包

flag 包有一個擴展功能用來解析命令行選項。

flag.Parse() 掃描參數列表(或者常量列表)并設置 flag, flag.Arg(i) 表示第 i 個參數。Parse() 之后 flag.Arg(i) 全部可用

flag.Narg() 返回參數的數量。解析后 flag 或常量就可用了。 flag.Bool() 定義了一個默認值是 false 的 flag

flag.PrintDefaults() 打印 flag 的使用幫助信息

用 buffer 讀取文件

package main
?
import ("bufio""flag""fmt""io""os"
)
?
func cat(r *bufio.Reader) {for {buf, err := r.ReadBytes('\n')if err == io.EOF {break}fmt.Fprintf(os.Stdout, "%s", buf)}return
}
?
func main() {flag.Parse()if flag.NArg() == 0 {cat(bufio.NewReader(os.Stdin))}for i := 0; i < flag.NArg(); i++ {f, err := os.Open(flag.Arg(i))if err != nil {fmt.Fprintf(os.Stderr, "%s:error reading from %s: %s\n", os.Args[0], flag.Arg(i), err.Error())continue}cat(bufio.NewReader(f))}
}

JSON 數據格式

// json.go
package main
?
import ("encoding/json""fmt""log""os"
)
?
type Address struct {Type ? ?stringCity ? ?stringCountry string
}
?
type VCard struct {FirstName stringLastName ?stringAddresses []*AddressRemark ? ?string
}
?
func main() {pa := &Address{"private", "Aartselaar", "Belgium"}wa := &Address{"work", "Boom", "Belgium"}vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}// fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:// JSON format:js, _ := json.Marshal(vc)fmt.Printf("JSON format: %s", js)// using an encoder:file, _ := os.OpenFile("vcard.json", os.O_CREATE|os.O_WRONLY, 0666)defer file.Close()enc := json.NewEncoder(file)err := enc.Encode(vc)if err != nil {log.Println("Error in encoding json")}
}

出于安全考慮,在 web 應用中最好使用 json.MarshalforHTML() 函數,其對數據執行 HTML 轉碼,所以文本可以被安全地嵌在 HTML <script> 標簽中。

json.NewEncoder() 的函數簽名是 func NewEncoder(w io.Writer) *Encoder,返回的 Encoder 類型的指針可調用方法 Encode(v interface{}),將數據對象 v 的 json 編碼寫入 io.Writer w 中。

JSON 與 Go 類型對應如下:

bool 對應 JSON 的 booleans float64 對應 JSON 的 numbers string 對應 JSON 的 strings nil 對應 JSON 的 null 不是所有的數據都可以編碼為 JSON 類型:只有驗證通過的數據結構才能被編碼:

JSON 對象只支持字符串類型的 key;要編碼一個 Go map 類型,map 必須是 map [string] T(T 是 json 包中支持的任何類型) Channel,復雜類型和函數類型不能被編碼 不支持循環數據結構;它將引起序列化進入一個無限循環 指針可以被編碼,實際上是對指針指向的值進行編碼(或者指針是 nil)

反序列化:

UnMarshal() 的函數簽名是 func Unmarshal(data []byte, v interface{}) error 把 JSON 解碼為數據結構。

上述示例中對 vc 編碼后的數據為 js ,對其解碼時,我們首先創建結構 VCard 用來保存解碼的數據:var v VCard 并調用 json.Unmarshal(js, &v),解析 [] byte 中的 JSON 數據并將結果存入指針 &v 指向的值。雖然反射能夠讓 JSON 字段去嘗試匹配目標結構字段;但是只有真正匹配上的字段才會填充數據。字段沒有匹配不會報錯,而是直接忽略掉。

編碼和解碼流

json 包提供 Decoder 和 Encoder 類型來支持常用 JSON 數據流讀寫。NewDecoder 和 NewEncoder 函數分別封裝了 io.Reader 和 io.Writer 接口。

func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder

要想把 JSON 直接寫入文件,可以使用 json.NewEncoder 初始化文件(或者任何實現 io.Writer 的類型),并調用 Encode ();反過來與其對應的是使用 json.Decoder 和 Decode () 函數:

func NewDecoder(r io.Reader) *Decoder
func (dec *Decoder) Decode(v interface{}) error

用 Gob 傳輸數據

Gob 是 Go 自己的以二進制形式序列化和反序列化程序數據的格式;可以在 encoding 包中找到。這種格式的數據簡稱為 Gob (即 Go binary 的縮寫)。類似于 Python 的 "pickle" 和 Java 的 "Serialization"。

它和 JSON 或 XML 有什么不同呢?Gob 特定地用于純 Go 的環境中,例如,兩個用 Go 寫的服務之間的通信。這樣的話服務可以被實現得更加高效和優化。 Gob 不是可外部定義,語言無關的編碼方式。因此它的首選格式是二進制,而不是像 JSON 和 XML 那樣的文本格式。

// gob1.go
package main
?
import ("bytes""fmt""encoding/gob""log"
)
?
type P struct {X, Y, Z intName ? ?string
}
?
type Q struct {X, Y *int32Name string
}
?
func main() {// Initialize the encoder and decoder.  Normally enc and dec would be ? ? ?// bound to network connections and the encoder and decoder would ? ? ?// run in different processes. ? ? ?var network bytes.Buffer ? // Stand-in for a network connection ? ? ?enc := gob.NewEncoder(&network) // Will write to network. ? ? ?dec := gob.NewDecoder(&network) // Will read from network. ? ? ?// Encode (send) the value. ? ? ?err := enc.Encode(P{3, 4, 5, "Pythagoras"})if err != nil {log.Fatal("encode error:", err)}// Decode (receive) the value. ? ? ?var q Qerr = dec.Decode(&q)if err != nil {log.Fatal("decode error:", err)}fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
}
// Output: ? "Pythagoras": {3,4}

學習參考資料:

《Go 入門指南》 | Go 技術論壇 (learnku.com)

Go 語言之旅

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據開發(Java面試真題-卷三)

大數據開發&#xff08;Java面試真題&#xff09; 1、簡要介紹以下JVM有幾種垃圾收集器&#xff1f;2、Java中Synchronized的底層原理是什么&#xff1f;3、Java String為什么是不可變的&#xff1f;為什么要設計成不可變&#xff1f;4、泛型&#xff1f;5、常用的反射方法&…

深入Java日志框架及其最佳實踐

概述 在Java應用開發中&#xff0c;日志框架是確保應用穩定性和可觀察性的關鍵組件。它幫助開發者記錄應用的行為、診斷問題&#xff0c;并監控系統的健康狀況。隨著Java生態系統的不斷發展&#xff0c;各種日志框架也應運而生&#xff0c;各有特點和優勢。本文將詳細探討幾個…

redis進階(一)

文章目錄 前言一、Redis中的對象的結構體如下&#xff1a;二、壓縮鏈表三、跳躍表 前言 Redis是一種key/value型數據庫&#xff0c;其中&#xff0c;每個key和value都是使用對象表示的。 一、Redis中的對象的結構體如下&#xff1a; /** Redis 對象*/ typedef struct redisO…

c# .net8 香橙派orangepi + hc-04藍牙 實例

這些使用c# .net8開發&#xff0c;硬件 香橙派 orangepi 3lts和 hc-04藍牙 使用場景&#xff1a;可以通過這個功能&#xff0c;手機連接orangepi進行wifi等參數配置 硬件&#xff1a; 1、帶USB口的linux開發板orangepi 2、USB 轉TTL 中轉接藍牙&#xff08;HC-04) 某寶上買…

Vue的響應式原理是如何實現的

Vue的響應式原理主要**基于JavaScript的Object.defineProperty方法實現**。具體如下&#xff1a; 1. 數據劫持&#xff08;Data Hijacking&#xff09; Vue在初始化時&#xff0c;會遍歷data對象中的所有屬性&#xff0c;并使用Object.defineProperty將這些屬性轉換為getter/s…

Flink:Temporal Table Function(時態表函數)和 Temporal Join

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

AR時間序列模型

AR時間序列模型&#xff08;AutoRegressive Time Series Model&#xff09;是一種用于分析和預測時間序列數據的統計模型。該模型假設未來的觀測值與過去的觀測值相關&#xff0c;且該相關性可以通過線性回歸來描述。 AR模型的基本思想是將當前時刻的觀測值表示為過去幾個時刻…

設計模式(十五)狀態模式

請直接看原文:設計模式系列 ------------------------------------------------------------------------------------------------------------------------------- 前言 建議在閱讀本文前先閱讀設計模式&#xff08;十一&#xff09;策略模式這篇文章&#xff0c;雖說狀態…

java.sqlrecoverableexception: io error: the network adapter could not establ

數據庫相關學習資料下載地址&#xff1a; 數據庫相關資料合集 Java SQLRecoverableException: IO Error: The Network Adapter Could Not Establish Connection 在進行Java開發中&#xff0c;經常會遇到與數據庫進行交互的情況。然而&#xff0c;有時候我們可能會遇到java.sq…

Redis過期刪除策略

1、定時刪除&#xff1a; 一旦鍵過期就立即從內存中刪除&#xff0c;節省內存空間&#xff0c;但刪除過程會占用大量CPU時間&#xff0c;可能影響服務器的響應時間和吞吐量。 2、惰性刪除&#xff1a; 并不會立即從內存中刪除過期鍵&#xff0c;而是在需要訪問時才會檢查是否…

【MATLAB】MVMD_ MFE_SVM_LSTM 神經網絡時序預測算法

有意向獲取代碼&#xff0c;請轉文末觀看代碼獲取方式~也可轉原文鏈接獲取~ 1 基本定義 MVMD_MFE_SVM_LSTM神經網絡時序預測算法結合了多變量多尺度分解&#xff08;MVMD&#xff09;、多尺度特征提取&#xff08;MFE&#xff09;、支持向量機&#xff08;SVM&#xff09;和長…

Python爬蟲之爬取并下載嗶哩嗶哩視頻

親自使用過&#xff0c;太好用了 # 導入requests模塊&#xff0c;模擬發送請求 import requests # 導入json import json # 導入re import re# 定義請求頭 headers {Accept: */*,Accept-Language: en-US,en;q0.5,User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6…

小米消息隊列的選型與實踐

之前寫了一篇關于消息隊列的文章&#xff1a;《消息隊列介紹與對比》&#xff0c;本文主要介紹消息隊列在實際工作中的使用情況&#xff08;截止到2023年&#xff0c;因為我2023年離職了&#xff0c;后續的情況不了解了&#xff0c;哈哈&#xff09;。 市面上的多種消息隊列都有…

node問題: command not found: nodemon

如何安裝并使用 nodemon npm i -g nodemon 問題與解決方案&#xff1a; 問題&#xff1a;zsh: command not found: nodemon 解決方案&#xff1a; 在你的 package.json 中加入&#xff1a; "scripts": {"auto": "npx nodemon server.js" }…

單例模式及應用場景

如果希望自己的代碼更優雅、可維護性更高以及更簡潔&#xff0c;往往離不開設計模式這一解決方案。 在JS設計模式中&#xff0c;最核心的思想&#xff1a;封裝變化&#xff08;將變與不變分離&#xff0c;確保變化的部分靈活&#xff0c;不變的部分穩定&#xff09;。 那么來…

[嵌入式系統-36]:龍芯1B 開發學習套件 -5- PMON常見命令

目錄 0. 開機時按c鍵進入pmon模式 &#xff08;自啟動模式時&#xff09; 1、幫助命令 h 2、顯示設備信息 devls 3.重啟&#xff1a;reboot 4、設置環境變量 set/unset 5.查詢環境變量&#xff1a;env 6.網絡設置相關命令&#xff1a; ①設置IP&#xff1a;ifconfig&am…

Linux 基礎IO(1)內存文件

文章目錄 鋪墊文件的系統調用接口文件描述符緩沖區 鋪墊 文件文件內容 文件屬性訪問文件之前&#xff0c;都要先打開文件&#xff0c;而要訪問&#xff0c;修改&#xff0c;編輯文件&#xff0c;文件就必須加載到內存中程序運行起來變成進程&#xff0c;被CPU調度&#xff0c;…

詳解Win 7重置電腦操作步驟

文章目錄 介紹Win 7 重置系統的方法&#xff1a;1.按下鍵盤上的Windows鍵和R鍵&#xff0c;打開運行窗口&#xff0c;輸入sysprep 點擊回車確定。2.之后就會出現如下界面&#xff0c;在這個新打開的窗口中雙擊 sysprep 程序3.選擇【進入系統全新體驗&#xff08;00BE) 】&#…

基于SpringBoot的在線拍賣系統(附項目源碼+論文)

摘要 在線拍賣系統&#xff0c;主要的模塊包括管理員&#xff1b;首頁、個人中心、用戶管理、商品類型管理、拍賣商品管理、歷史競拍管理、競拍訂單管理、留言板管理、系統管理&#xff0c;用戶&#xff1b;首頁、個人中心、歷史競拍管理、競拍訂單管理、留言板管理&#xff0…

Linux重新獲取IP地址

你可以通過重啟客戶端來獲取新的IP地址。可以使用以下命令來重啟DHCP客戶端&#xff1a; sudo dhclient -r # 釋放當前IP sudo dhclient # 獲取新的IP 這將釋放當前的IP地址&#xff0c;并請求新的IP地址。 使用ifdown和ifup命令&#xff1a;另一種方法是使用ifdown和i…