go语言基础 seek光标位置os包的使用


Posted in Golang onMay 09, 2021

语法:

os.Open()-->*File,err *****

File.Seek(offset, whence),设置光标的未知

offset,偏移量

whence,从哪开始:0从头,1当前,2末尾

package main
import (
   "os"
   "fmt"
)
func main()  {
   /*
   seek(offset int, whence int),表示设置光标的位置
      offset int,设置多少个字节
   whence int,从哪开始
      0,距离文件开头
      1,当前的位置
      2,距离文件末尾
    */
    //file,_:= os.Open("C:\\liu\\pro\\aa.txt") //RDONLY
    file,_:=os.OpenFile("C:\\liu\\pro\\aa.txt",os.O_RDWR,0)
    //1.打开文件后,光标默认在文件开头。
    bs := make([] byte, 1)
    defer file.Close()
    //2.seek()
    //设置光标的位置在:距离文件开头,4个字节处。
    //file.Seek(8,0)
    count, _:= file.Read(bs)
   fmt.Println(string(bs[:count])) //a
    file.Seek(4,2)
   //count, _= file.Read(bs)
   //fmt.Println(string(bs[:count])) //
   file.Write([]byte{65,66,67})
   fmt.Println("写完了。。")
}

补充:Go语言-命令行参数(os.Args, flag包)

大部分Go程序都是没有UI的,运行在纯命令行的模式下,该干什么全靠运行参数。

这里介绍下Go语言命令行程序和他们的参数。

1. os.Args

程序获取运行他时给出的参数,可以通过os包来实现。先看代码:

package main
import (
 "fmt"
 "os"
 "strconv"
)
func main () {
 for idx, args := range os.Args {
  fmt.Println("参数" + strconv.Itoa(idx) + ":", args)
 }
}

运行起来得到的如下:

$go run main.go 1 3 -X ?

参数0: /tmp/go-build116558042/command-line-arguments/_obj/exe/main

参数1: 1

参数2: 3

参数3: -X

参数4: ?

可以看到,命令行参数包括了程序路径本身,以及通常意义上的参数。

程序中os.Args的类型是 []string ,也就是字符串切片。所以可以在for循环的range中遍历,还可以用 len(os.Args) 来获取其数量。

如果不想要输出os.Args的第一个值,也就是可执行文件本身的信息,可以修改上述程序:

for idx, args := range os.Args[1:] {

将range后面的切片,去掉第一个元素。

输出切片的所有元素,还有更简洁的方式:

fmt.Println(strings.Join(os.Args[1:], "\n"))
fmt.Println(os.Args[1:])
/*
后一种方式的结果是[1 3 -X ?],这是fmt.Println输出切片的格式
*/

2. flag包

flag包相比单纯的通过os.Args切片分析命令行参数,提供了更强的能力。

来看个例子:

package main
import (
	"fmt"
	"flag"
)
var b = flag.Bool("b", false, "bool类型参数")
var s = flag.String("s", "", "string类型参数")
func main() {
	flag.Parse()
	fmt.Println("-b:", *b)
	fmt.Println("-s:", *s)
	fmt.Println("其他参数:", flag.Args())
}
------------------------------------
$ go run main.go
-b: false
-s: 
其他参数: []
------------------------------------
$ go run main.go -b
-b: true
-s: 
其他参数: []
------------------------------------
$ go run main.go -b -s test others
-b: true
-s: test
其他参数: [others]
------------------------------------
$ go run main.go  -help
Usage of /tmp/go-build080353851/command-line-arguments/_obj/exe/main:
  -b	bool类型参数
  -s string
    	string类型参数
exit status 2

2.1 定义参数

使用flag包,首先定义待解析命令行参数,也就是以"-"开头的参数,比如这里的 -b -s -help等。-help不需要特别指定,可以自动处理。

这里指定了两个参数,-b和-s:

var b = flag.Bool("b", false, "bool类型参数")
var s = flag.String("s", "", "string类型参数")
-----------------
原型:
func Bool(name string, value bool, usage string) *bool
func String(name string, value string, usage string) *string

通过flag.Bool和flag.String,建立了2个指针b和s,分别指向bool类型和string类型的变量。所以后续要通过 *b 和 *s 使用变量值。

flag.Bool和flag.String的参数有3个,分别是命令行参数名称,默认值,提示字符串。

参数 功能
name 命令行参数名称,比如 -b, -help
value 默认值,未显式指定的参数,给出隐式的默认值,比如本例中-b未给出的话,*b=false
usage 提示信息,如果给出的参数不正确或者需要查看帮助 -help,那么会给出这里指定的字符串

2.2 解析参数

flag使用前,必须首先解析:

flag.Parse()

2.3 使用参数

上文已经说明,通过flag方法定义好的参数变量指针,通过间接引用操作即可使用其内容:

fmt.Println("-b:", *b)
fmt.Println("-s:", *s)

2.4 未解析参数

参数中没有能够按照预定义的参数解析的部分,通过flag.Args()即可获取,是一个字符串切片。

fmt.Println("其他参数:", flag.Args())

需要注意的是,从第一个不能解析的参数开始,后面的所有参数都是无法解析的。即使后面的参数中含有预定义的参数:

$ go run main.go -b stop -s test others
-b: true
-s: 
其他参数: [stop -s test others]

上面例子中,解析到stop,就已经无法继续解析了,即使后面给出了预定义好的-s,也是不能获取出来的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
goland设置颜色和字体的操作
May 05 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Go timer如何调度
Jun 09 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang日志包的使用
Apr 20 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 #Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 #Golang
GoLang中生成UUID唯一标识的实现
May 08 #Golang
聊聊golang中多个defer的执行顺序
May 08 #Golang
Golang全局变量加锁的问题解决
golang 实现并发求和
May 08 #Golang
golang中的并发和并行
May 08 #Golang
You might like
PHP URL参数获取方式的四种例子
2014/02/28 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
Stop SQL Server
2007/06/21 Javascript
js停止输出代码
2008/07/20 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
用js实现放大镜效果
2020/10/28 Javascript
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
selenium+python环境配置教程详解
2019/05/28 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Python pymsql模块的使用
2020/09/07 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
商务代表岗位职责
2015/02/15 职场文书
罚款通知怎么写
2015/04/22 职场文书
运动会班级前导词
2015/07/20 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python