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.mzph.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…