终端操作

操作终端相关的文件句柄常量
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:%s\n",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("%s\n",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("hello\n")
}
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 :%s\n",conf)
fmt.Printf("level is :%d\n",level)
}

上面的例子设置了默认参数,如果我们想自定义参数在运行的时候添加 -c=内容 -l=内容 ,就可以用我们通过命令行参数传入的值进行处理

Go基础--终端操作和文件操作的更多相关文章

  1. golang之终端操作,文件操作

    终端操作 操作终端相关的文件句柄常量os.Stdin:标准输入os.Stdout:标准输出os.Stderr:标准错误输出 关于终端操作的代码例子: package main import " ...

  2. python基础之元组、文件操作、编码、函数、变量

    1.集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: list_1 = [1,4,5,7,3,6 ...

  3. Python之路:Python 基础(三)-文件操作

    操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = file('文件路径', '模式') # 还有一种方法open 例1.创建文件  f = file('myfile. ...

  4. Python基础(七)-文件操作

    一.文件处理流程 1.打开文件,得到文件句柄赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 二.基本操作 f = open('zhuoge.txt') #打开文件 first_line = ...

  5. python基础 (编码进阶,文件操作和深浅copy)

    1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码. 即先将其他编码的字符串解码(decode)成unicode,再从uni ...

  6. python基础(四)文件操作和集合

    一.文件操作 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 1.文件基本操作: f = open('file.txt','r') # ...

  7. Py修行路 python基础 (七)文件操作 笔记(随时更改添加)

    文件操作流程: 1.打开文件 open() 2.操作文件 read .writeread(n) n对应读指定个数的 2.x中读取的是字节! 3.x中读取的是字符!read 往外读取文件,是以光标位置开 ...

  8. python基础(三)-- 文件操作

    一. 文件操作: 对文件操作流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 现有文件如下 : Somehow, it seems the love I kn ...

  9. python3速查参考- python基础 5 -> 常用的文件操作

    文件的打开方式 打开方式 详细释义 r  以只读方式打开文件.文件的指针会放在文件的开头.这是默认模式. rb  以二进制只读方式打开一个文件.文件指针会放在文件的开头. r+  以读写方式打开一个文 ...

随机推荐

  1. 输出数组第k大的元素

    用快速排序的思想输出数组第k大的元素: #include<iostream> #include<algorithm> using namespace std; //递归实现:返 ...

  2. Vacuum tube 真空管/电子管

    真空管/电子管的发明 1904, John Ambrose Fleming invented the two-electrode vacuum-tube rectifier, which he cal ...

  3. 转:Ogre的SceneManager分析

    SceneManager分析 场景管理主要工作包括以下几点: 1.可移动.不可移动和可渲染物体的创建删除. 2.场景查询. 3.渲染队列. 4.动态阴影. 一. 场景对象创建 场景中的所有对象,包括可 ...

  4. rac安装_grid安装校验报错之grid未建立信任关系

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  5. 【laravel5.*】详解laravel中的依赖注入

    1.下面这个是自定义的类,钉钉扫码登录web 网页授权OAuth2.0,是一个典型的依赖注入参考示例:

  6. syslog远程日志存储/514端口【转】

    昨天在抓包的时候,发现在514端口,有SYSLOG字段的东西,不知道是用来干啥的,现在来分析一下: 其实他是在电脑间用了syslog远程日志存储,他用udp监控了514端口的数据流,之后收集整理日志: ...

  7. du命令解决linux磁盘空间满的问题(很不错的哦)

    首先你要确定是不是真正的是因为数据空间占满磁盘,经常是因为某个程序的日志占满了空间.当发现磁盘满了以后不要着急,使用以下命令从根目录开始排除查找哪个文件夹最大: du --max-depth=1 找到 ...

  8. 使用 scp命令免登陆

    多台服务器之间互相拷贝文件一般常用scp命令但是让人困扰的是还要输入密码, 能不能不输入密码直接拷贝? 所幸方法是有的,ssh服务是支持免登陆的,不过需要密钥文件 方法如下: [root@WebSer ...

  9. fedora装机运行第一脚本

    博主原创: #!/bin/bash echo "更换源&更新源......" yum install wget -y yum install yum-fastestmirr ...

  10. HDU 4324 Triangle LOVE (拓扑排序)

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...