【Go语言】集合与文件操作
1.集合以及主要操作
首先要提到的是Go语言的内置数据类型map(字典类型 类似于Java中的HashMap和Swift中的Directory),这样你无需导入任何包便可 使用map类型了。map是一种特殊的数据结构,它是由一对无序的数据项组成,被称为键值对(Key-Value Pair)。其中的一项是键(Key) ,另一项是值(Value),map通过把键映射到值来进行访问,这种方式可以加快数据查找的速度(这也是map称为"字典"的原因)。
1_1.字典的声明
在声明时,除了要定义字典名,还要指定"键"类型和"值"类型,"键"类型要使用一对"[]"括起来。字典一般声明格式如下:
var mapName map[keyType]valueType
说明:
(1)字典名的命名规则和变量名相同,遵循标示符命名规则
(2)不要给字典指定长度,字典的长度会在初始化或创建过程中动态增长
(3)Key必须是支持比较运算符(==、!=)的数据类型,比如整型‘浮点型、指针、数组、结构体、接口等,而不能是函数、字典、切片 这几种类型。
(4)Value类型可以是Go语言的任何基本数据类型
1_2.字典的初始化和创建
字典声明好后必须经过初始化或创建才能使用,未初始化或创建的字典值为nil。可以使用"{}"操作符对字典进行初始化,或使用make()函数来创建字典。初始化或创建后,就可以使用"="操作符向字典动态增添数据项了。
例如下面的操作语句编译时会出错:
var map1 map[string]int
map1["key1"] = 1
出错的原因是虽然声明了字典map1,但map1没有被初始化,所以系统并没有给它分配存储空间,也就不能向map1中添加数据项了。 下面的操作语句是正确的:
var map1 map[string]int{}
map1["key1"] = 1
上面的操作语句正确,因为在声明字典map1的同时使用了"{}"操作符对字典进行了初始化,也就意味着系统给map1分配了存储空间,当然就可以使用"="操作符向map1添加数据项了。
下面的语句也是正确的:
var map1 map[string]int
map1 = make(map[string]int)
map1["key1"] = 1
这里首先声明字典map1,然后使用make()函数来创建map1,make函数操作的使之就是给map1分配存储空间,所以make后也可以使用"="操作符向map1添加数据项。
1_3.字典的访问和操作
1_3_1.字典项查找
在Go语言中,要从字典中查找一个特定的键值对,可以通过以下语句实现:
value, ok = mapName[Key]
这条语句执行后,如果查找的key值存在,则将key对应的value值赋予v,OK为true;反之,如果key不存在,则v等于0,ok为false。所以在使用时应该在每次取值操作后,先对ok进行判断,再进行对value的操作。
1_3_2.字典项的删除
Go语言提供内置的delete()函数用来删除容器中的元素。delete()函数也可以用于删除map内的键值对。
例如:
delete(map1, key1)
1_4.其他类型的数据集
Go语言的标准库中的container包下实现了其他几种数据集合类型,这些类型不像内置类型map那么常用,但在程序开发中提高了很多效率。下面简单地介绍一下:
包heap
官方的说明是:Package heap provides heap operations for any type that implements heap.Interface.
包heap为实现接口heap.Interface的所有类型提供了堆操作.
包list
官方的说明是:Package list implements a doubly linked list.
包list实现了一个双向链表。
包ring
官方说明是:Package ring implements operations on circular lists.
包ring实现了关于循环表的操作。
2.文件操作
2_1.文件操作概述os包和path包
os包简介:Go语言的os包中包含了许多对系统相关的操作,而且是不依赖于系统平台的,正如官方描述的Package os provides a platform-independent interface to operating system functionality。这其中就包含了对进程(Process)和信号(Signal)等的一些操作,当然也包括对文件和目录的操作。下面的几个有关文件操作的函数和类型定义在os包中:
func Mkdir(name string, perm FileMode) error
func MkdirAll(path string, perm FileMode) error
func Remove(name string) error
func RemoveAll(path string) error
func Rename(oldname, newname string) error
func SameFile(fi1, fi2 FileInfo) bool
type File
func Create(name string) (file *File, err error)
func NewFile(fd uintptr, name string) *File
func Open(name string) (file *File, err error)
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
func Pipe() (r *File, w *File, err error)
func (f *File) Chdir() error
func (f *File) Chmod(mode FileMode) error
func (f *File) Chown(uid, gid int) error
func (f *File) Close() error
func (f *File) Fd() uintptr
func (f *File) Name() string
func (f *File) Read(b []byte) (n int, err error)
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
func (f *File) Readdir(n int) (fi []FileInfo, err error)
func (f *File) Readdirnames(n int) (names []string, err error)
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
func (f *File) Stat() (fi FileInfo, err error)
func (f *File) Sync() (err error)
func (f *File) Truncate(size int64) error
func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
func (f *File) WriteString(s string) (ret int, err error)
type FileInfo
func Lstat(name string) (fi FileInfo, err error)
func Stat(name string) (fi FileInfo, err error)
type FileMode
func (m FileMode) IsDir() bool
func (m FileMode) IsRegular() bool
func (m FileMode) Perm() FileMode
func (m FileMode) String() string
type LinkError
func (e *LinkError) Error() string
type PathError
func (e *PathError) Error() string
path包简介:Package path implements utility routines for manipulating slash-separated paths. 译为:path包提供了对以斜杠分隔的路径的操作的常规方法。
2_2.文件操作示例
目录操作:
package main import (
"fmt"
"os"
) func main() {
os.Mkdir("mike", 0777) //func Mkdir(name string, perm FileMode) error
//创建名称为name的目录,权限设置是perm,例如0777
os.MkdirAll("mike/test1/test2", 0777) //func MkdirAll(path string, perm FileMode) error
//根据path创建多级子目录,例如mike/test1/test2
err := os.Remove("mike") //func Remove(name string) error
//删除名称为name的目录,当目录下有文件或者其他目录是会出错
if err != nil {
fmt.Println(err)
}
os.RemoveAll("mike") //func RemoveAll(path string) error
//根据path删除多级子目录,如果path是单个名称,那么该目录不删除。
}
打开与建立文件:
新建文件可以通过如下两个方法
func Create(name string) (file *File, err Error)
根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666的文件,返回的文件对象是可读写 的。
func NewFile(fd uintptr, name string) *File
根据文件描述符创建相应的文件,返回一个文件对象 通过如下两个方法来打开文件:
func Open(name string) (file *File, err Error)
该方法打开一个名称为name的文件,但是是只读方式,内部实现其实调用了OpenFile。
func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限
写文件:
写文件函数:
func (file *File) Write(b []byte) (n int, err Error)
写入byte类型的信息到文件
func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
在指定位置开始写入byte类型的信息
func (file *File) WriteString(s string) (ret int, err Error)
写入string信息到文件
写文件的示例代码
package main import (
"fmt"
"os"
) func main() {
userFile := "mike.txt"
fout, err := os.Create(userFile)
defer fout.Close()
if err != nil {
fmt.Println(userFile, err)
return
}
for i := 0; i < 10; i++ {
fout.WriteString("Just a test!\r\n")
fout.Write([]byte("Just a test!\r\n"))
}
}
读文件:
读文件函数:
func (file *File) Read(b []byte) (n int, err Error)
读取数据到b中
func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
从off开始读取数据到b中
读文件的示例代码:
package main import (
"fmt"
"os"
) func main() {
userFile := "mike.txt"
fl, err := os.Open(userFile)
defer fl.Close()
if err != nil {
fmt.Println(userFile, err)
return
}
buf := make([]byte, 1024)
for {
n, _ := fl.Read(buf)
if 0 == n {
break
}
os.Stdout.Write(buf[:n])
}
}
删除文件:
Go语言里面删除文件和删除文件夹是同一个函数
func Remove(name string) Error
调用该函数就可以删除文件名为name的文件
【Go语言】集合与文件操作的更多相关文章
- C语言样式的文件操作函数
使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...
- Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- python03-break、continue、for循环、数据bytes类型、字符串与字节的关系、变量指向与深浅拷贝、set集合、文件操作
目录: 1.break.continue 2.for循环 3.数据bytes类型 4.字符串与字节的关系 5.变量指向与深浅拷贝 6.set集合 7.文件操作 一.break.continue bre ...
- Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数
1. 集合 1.1 特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...
- NO.3:自学python之路------集合、文件操作、函数
引言 本来计划每周完成一篇Python的自学博客,由于上一篇到这一篇遇到了过年.开学等杂事,导致托更到现在.现在又是一个新的学期,春天也越来越近了(冷到感冒).好了,闲话就说这么多.开始本周的自学Py ...
- Go语言基础之文件操作
本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open()函数能够打开一个 ...
- GO学习-(16) Go语言基础之文件操作
Go语言文件操作 本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open( ...
- Python学习Day2笔记(集合和文件操作)
1.集合的使用 列表是有序的可包含重复内容的 集合是无序的不可包含重复内容的 1) 集合关系测试 #列表去重list_1=[1,4,5,6,7,8,9,7,5,4,23,2] #有重复数据 list_ ...
随机推荐
- java thread run and start
在java中继承Thread,线程启动有两中方法:start()和run().下面简单介绍一下两者的区别. start():启动一个线程,此时线程处于就绪状态,然后调用Thread对象的run()方法 ...
- PHP模拟POST请求,获取response内容
/* * 模拟POST请求,获取response内容 */ protected function curl($url, $type, $header, $data) { $CURL_OPTS = ar ...
- 数字信号处理实验(零)—— 一维声音信号处理和二维图像处理
一.在matlab下声音信号的I/O 1.读wav文件函数 •y = wavread('filename') •[y,Fs,bits] = wavread('filename') •[...] = w ...
- ubuntu 安装fcitx输入法
ubuntu 14 的环境 我用的ibus输入法和firefox 36.0.4 版本相互冲突,有bug.在输入栏无法选中,以及复制.查其原因是ibus输入法有问题,需要重新换个输入法. 我先卸载了ib ...
- minix3(一)安装以及编辑文件
作为一条通信狗,最近开始自学操作系统.听说用MINIX3学操作系统很好,就决定跟UCSB的课程试试. 首先在虚拟机上安装MINIX3. 开始用的VM Station,按照百度文库里安装minix3的教 ...
- H5移动前端性能优化
在移动端,因手机的配置和3/4G网络的原因,从两个方面解决性能优化问题,1.加载不超过3秒,用loading或者资源不要超过1M.2.渲染速度. 基于以上两个方面,所有影响首屏加载和渲染的代码应在处理 ...
- CSS总结2
1.动画: transform:rotate(10deg): transform:scale(2), scaleY(2), scaleX(2), scale(1,1) scale(-1)---让 ...
- Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系。
DCP ,BPL分别是什么文件,起什么作用?你在DELPHI中建立一个package然后保存一下,看看. bpl和Dll比较相似.只是BPL是BORLAND自己弄出来的东西!!!调用也和调用DLL相似 ...
- Java 生成16/32位 MD5
http://blog.csdn.net/codeeer/article/details/30044831
- iOS Xcode个人常用插件
1.AdjustFontSize 按command +/-进行字体大小调整 2.ATProperty @property专用,strong.assign.copy.weak IBOutlet 3.Ba ...