Go基础--终端操作和文件操作
终端操作
操作终端相关的文件句柄常量 os.Stdin:标准输入 os.Stdout:标准输出 os.Stderr:标准错误输出
关于终端操作的代码例子:
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 enter your full name:")
//fmt.Scanln(&firstName,&lastName)
fmt.Scanf("%s %s",&firstName,&lastName) //这一句和上一句是相同的
fmt.Printf("Hi %s %s!n",firstName,lastName)
fmt.Sscanf(input,format,&f,&i,&s)
fmt.Println("From the string we read:",f,i,s)
}
关于带缓冲区的读写
这里需要用到一个包:bufio
下面是代码例子:
package main
import (
"bufio"
"os"
"fmt"
)
var inputReader *bufio.Reader
var input string
var err error
func main(){
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("please enter some input:")
// 下面这个表示我们读取一行,最后是以n 为分割的,n表示换行
input,err = inputReader.ReadString('n')
if err != nil{
fmt.Println(err)
return
}
fmt.Printf("the input was:%sn",input)
}
练习终端操作
从终端读取一行字符串,统计英文,数字,空格以及其他字符的数量 代码实现:
package main
import (
"fmt"
"bufio"
"os"
)
func judgeCount(str string){
var countNum, countLetter, countSpace, countOther int
for _, v := range str {
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("英文字母的个数:", countLetter)
fmt.Println("数字的个数:", countNum)
fmt.Println("空格的个数:", countSpace)
// 关于其他字符这里进行减一是因为这里多算了一个换行符n
fmt.Println("其他字符的个数:", countOther-1)
}
func main(){
fmt.Println("请输入一行字符串:")
var inputReader *bufio.Reader
inputReader = bufio.NewReader(os.Stdin)
str,err := inputReader.ReadString('n')
if err!=nil{
fmt.Println("输入错误,错误为:",err)
return
}
judgeCount(str)
}
关于文件读写
os.File封装所有文件相关的操作
打开一个文件进行读操作:os.Open(name string)(*File,error) 关闭一个文件:File.Close()
关于文件操作的一个简单例子:
package main
import (
"os"
"fmt"
"bufio"
"io"
)
func main(){
file,err:= os.Open("/Users/zhaofan/go_project/src/go_dev/07/ex13/main.go")
if err!= nil{
fmt.Println("open file is err:",err)
return
}
//这里切记在打开文件的时候跟上defer 关闭这个文件,防止最后忘记关闭
defer file.Close()
inputReader := bufio.NewReader(file)
for {
inputString,readError:= inputReader.ReadString('n')
// 这里readError == io.EOF表示已经读到文件末尾
if readError ==io.EOF{
return
}
// 下面会把每行的内容进行打印
fmt.Printf("the input is:%s",inputString)
}
}
上面例子中关于读文件是一行一行的读的,下面我们也可以一次性读完整的文件,但是切记如果文件过大,这种方法不适用,这里用到是io/ioutil包
package main
import (
"io/ioutil"
"fmt"
)
func main(){
buf,err := ioutil.ReadFile("/Users/zhaofan/go_project/src/go_dev/07/ex13/main.go")
if err != nil{
fmt.Println("read file is err:",err)
return
}
fmt.Printf("%sn",string(buf))
}
关于读取压缩文件的例子,这里用到的是compress/gzip包
package main
import (
"os"
"fmt"
"compress/gzip"
"bufio"
"io"
)
func main(){
file,err := os.Open("/Users/zhaofan/go_project/src/go_dev/07/ex6/ggg.gz")
if err != nil{
fmt.Println("open file err:",err)
return
}
defer file.Close()
reader,err :=gzip.NewReader(file)
if err != nil{
fmt.Println("gzip err:",err)
return
}
bufReader := bufio.NewReader(reader)
for{
line,err := bufReader.ReadString('n')
if err != nil{
if err == io.EOF{
break
}
fmt.Println("read file err",err)
break
}
fmt.Printf("%s",line)
}
}
关于文件的写入
os.OpenFile("filename",os.O_WRONLY|os.O_CREATE,066)
第一个参数是文件名 第二个参数是文件的打开模式: os.O_WRONLY:只写 os.O_CREATE:创建文件 os.O_RDONLY:只读 os.O_RDWR:读写 os.O_TRUNC:清空
第三个参数:权限控制 r-->4 w-->2 x-->1 这里和linux的是一样的
关于写入文件的一个例子,这里写了两种方法一种是直接writestring方法,一种是通过bufio的方式:
package main
import (
"os"
"fmt"
"bufio"
)
func testWriteFile(){
file,err:= os.OpenFile("mylog.txt",os.O_WRONLY|os.O_CREATE,0666)
if err!= nil{
fmt.Println("open file failed:",err)
return
}
defer file.Close()
for i:=0;i<10;i++{
file.WriteString(fmt.Sprintf("go web 开发n"))
}
}
func testWriteBuf(){
file,err:= os.OpenFile("mylog.txt",os.O_WRONLY|os.O_CREATE,0666)
if err!= nil{
fmt.Println("open file failed:",err)
return
}
defer file.Close()
bufioWrite := bufio.NewWriter(file)
for i:=0;i<10;i++{
bufioWrite.WriteString("hellon")
}
bufioWrite.Flush()
}
func main(){
//testWriteFile()
testWriteBuf()
}
关于拷贝文件的例子:
package main
import (
"os"
"io"
)
func CopyFile()(writen int64,err error){
src,err:=os.Open("mylog.txt")
if err!= nil{
return
}
defer src.Close()
dst,err := os.OpenFile("dst.txt",os.O_WRONLY|os.O_CREATE,0644)
if err!=nil{
return
}
defer dst.Close()
return io.Copy(dst,src)
}
func main(){
CopyFile()
}
关于获取命令行参数
os.Args是一个string的切片,用来存储所有命令行的参数 但是通过这种方式获取参数有点笨拙,并且需要做很多的判断,我们可以通过go里面的flag包来做,代码例子如下:
package main
import (
"fmt"
"flag"
)
var(
conf string
level int
)
func init() {
flag.StringVar(&conf,"c","/home/user/zhaofan","请指定配置文件路径")
flag.IntVar(&level,"l",8,"请指定日志级别")
flag.Parse() //这个非常重要不能忘记写
}
func main() {
//for _,val := range os.Args{
// fmt.Println(val)
//}
fmt.Printf("conf is :%sn",conf)
fmt.Printf("level is :%dn",level)
}
上面的例子设置了默认参数,如果我们想自定义参数在运行的时候添加 -c=内容 -l=内容 ,就可以用我们通过命令行参数传入的值进行处理
- 4.python迭代器生成器装饰器
- 洛谷P2044 [NOI2012]随机数生成器
- 5.python函数
- TensorFlow 修炼之道(1)——张量(Tensor)
- 6.python内置函数
- 附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的 ”
- 7.python常用模块
- 8.python面向对象编程
- 莫比乌斯反演0
- 9.python异常处理
- Numpy 修炼之道 (9)—— 广播机制
- python爬虫人门(10)Scrapy框架之Downloader Middlewares
- 11.python线程
- Numpy 修炼之道 (8)—— 常用函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解PHP PDO简单教程
- Python实现ElGamal加密算法的示例代码
- PHP实现基于状态的责任链审批模式详解
- django rest framework使用django-filter用法
- 通过实例解析python创建进程常用方法
- thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
- OpenCV 之按位运算举例解析
- Python实时监控网站浏览记录实现过程详解
- php中的buffer缓冲区用法分析
- Python虚拟环境的创建和包下载过程分析
- Django视图、传参和forms验证操作
- Django:使用filter的pk进行多值查询操作
- 如何在keras中添加自己的优化器(如adam等)
- python实现将中文日期转换为数字日期
- PHP中使用CURL发送get/post请求上传图片批处理功能