【Go语言】集合与文件操作

本文目录

回到顶部

1.集合以及主要操作

首先要提到的是Go语言的内置数据类型map(字典类型 类似于Java中的HashMap和Swift中的Directory),这样你无需导入任何包便可 使用map类型了。map是一种特殊的数据结构,它是由一对无序的数据项组成,被称为键值对(Key-Value Pair)。其中的一项是键(Key) ,另一项是值(Value),map通过把键映射到值来进行访问,这种方式可以加快数据查找的速度(这也是map称为"字典"的原因)。

-1_1.字典的声明

回到顶部

1_1.字典的声明

在声明时,除了要定义字典名,还要指定"键"类型和"值"类型,"键"类型要使用一对"[]"括起来。字典一般声明格式如下:

var mapName map[keyType]valueType

说明:

(1)字典名的命名规则和变量名相同,遵循标示符命名规则

(2)不要给字典指定长度,字典的长度会在初始化或创建过程中动态增长

(3)Key必须是支持比较运算符(==、!=)的数据类型,比如整型‘浮点型、指针、数组、结构体、接口等,而不能是函数、字典、切片 这几种类型。

(4)Value类型可以是Go语言的任何基本数据类型

-1_2.字典的初始化和创建

回到顶部

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_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.其他类型的数据集

回到顶部

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包

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.文件操作示例

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的文件