重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
package main
创新互联是专业的桦川网站建设公司,桦川接单;提供成都做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行桦川网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
import (
"fmt"
"github.com/jonas-p/go-shp"
"log"
"reflect"
)
func main() {
// open a shapefile for reading
reader, err := shp.Open("E:/example.shp")
if err != nil {
log.Fatal(err)
}
defer reader.Close()
// fields from the attribute table (DBF)
fields := reader.Fields()
//fmt.Println(reader.AttributeCount())
//for k, f := range fields {
// fmt.Println(k,f)
//}
////fmt.Println(reader.Attribute(0))
//loop through all features in the shapefile
for reader.Next() {
n, p := reader.Shape()
point := p.(*shp.Point)
x := point.X
y := point.Y
fmt.Println(x, y)
// print feature
fmt.Println(reflect.TypeOf(p).Elem(), p.BBox())
// print attributes
for k, f :=range fields {
val := reader.ReadAttribute(n, k)
fmt.Printf("\t%v: %v\n", f, val)
}
fmt.Println()
}
}
本文主要介绍了Go语言中文件读写的相关操作。
文件是什么?
计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。
os.Open() 函数能够打开一个文件,返回一个 *File 和一个 err 。对得到的文件实例调用 close() 方法能够关闭文件。
为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。
Read方法定义如下:
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和 io.EOF 。 举个例子:
使用for循环读取文件中的所有数据。
bufio是在file的基础上封装了一层API,支持更多的功能。
io/ioutil 包的 ReadFile 方法能够读取完整的文件,只需要将文件名作为参数传入。
os.OpenFile() 函数能够以指定模式打开文件,从而实现文件写入相关功能。
其中:
name :要打开的文件名 flag :打开文件的模式。 模式有以下几种:
perm :文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。
队列的概念在 顺序队列 中,而使用循环队列的目的主要是规避假溢出造成的空间浪费,在使用循环队列处理假溢出时,主要有三种解决方案
本文提供后两种解决方案。
顺序队和循环队列是一种特殊的线性表,与顺序栈类似,都是使用一组地址连续的存储单元依次存放自队头到队尾的数据元素,同时附设队头(front)和队尾(rear)两个指针,但我们要明白一点,这个指针并不是指针变量,而是用来表示数组当中元素下标的位置。
本文使用切片来完成的循环队列,由于一开始使用三个参数的make关键字创建切片,在输出的结果中不包含nil值(看起来很舒服),而且在验证的过程中发现使用append()函数时切片内置的cap会发生变化,在消除了种种障碍后得到了一个四不像的循环队列,即设置的指针是顺序队列的指针,但实际上进行的操作是顺序队列的操作。最后是对make()函数和append()函数的一些使用体验和小结,队列的应用放在链队好了。
官方描述(片段)
即切片是一个抽象层,底层是对数组的引用。
当我们使用
构建出来的切片的每个位置的值都被赋为interface类型的初始值nil,但是nil值也是有大小的。
而使用
来进行初始化时,虽然生成的切片中不包含nil值,但是无法通过设置的指针变量来完成入队和出队的操作,只能使用append()函数来进行操作
在go语言中,切片是一片连续的内存空间加上长度与容量的标识,比数组更为常用。使用 append 关键字向切片中追加元素也是常见的切片操作
正是基于此,在使用go语言完成循环队列时,首先想到的就是使用make(type, len, cap)关键字方式完成切片初始化,然后使用append()函数来操作该切片,但这一方式出现了很多问题。在使用append()函数时,切片的cap可能会发生变化,用不好就会发生扩容或收缩。最终造成的结果是一个四不像的结果,入队和出队操作变得与指针变量无关,失去了作为循环队列的意义,用在顺序队列还算合适。
参考博客:
Go语言中的Nil
Golang之nil
Go 语言设计与实现
文件分类:文本文件和二进制文件
文本文件可读性好,占用的数据空间大
二进制文件,可读性差,占用的数据空间小
文件存取方式:随机存取和顺序存放
随机存取:操作速度慢,对磁盘的消耗大
顺序存放:操作数据块,对磁盘的消耗小
初级方法
高级方法
在程序和文件之间,添加一个缓冲区,每次程序读取文件内容的时候,先去缓冲区查看,如果需要的内容,直接获取,如果没有再去文件中获取
由于缓冲是在内存当中的,和程序的交互返回速度会非常快,这样可以大大提高程序的性能和速度
缺点:有的数据是只在缓冲中存储的,如果在缓冲释放之前,没有将数据实例化落盘,会导致数据的丢失
按行操作文件对象
将之前的file方法封装起来,可以更加方便的使用
使用gzip.NewReader(文件句柄),来操作压缩文件
示例: file,err := os.OpenFile("main.go", os.O_WRONLY|os.O_WRONLY, 0666)
三个参数,
文件操作方法,需要注意不能冲突
操作完成后,当前目录出现一个text.txt 文件,内容是:hello world,test
这里可以可以考虑使用buffio来实现
CFileFindff;CStringszName=dir;if(szName.Right(1)!="\\"){szName+="\\";}szName+="*.*";BOOLres=ff.FindFile(szName);while(res){res=ff.FindNextFile();if(!ff.IsDots())//目录是文件夹{//如果是一个子目录,用递归继续往深一层找TravelDir(dir+"\\"+ff.GetFileTitle());}elseif(!ff.IsDirectory()!ff.IsDots())//到达最低层的文件{CStringfileName=ff.GetFileName();}}}ff.Close();//关闭MessageBox(fileName);
使用文件名作为输入
另一个常见错误是将文件名传递给函数。
假设我们必须实现一个函数来计算文件中的空行数。最自然的实现是这样的:
filename 作为输入给出,所以我们打开它然后我们实现我们的逻辑,对吧?
现在,假设我们希望在此函数之上实现 单元测试 ,以使用普通文件,空文件,具有不同编码类型的文件等进行测试。很容易变得非常难以管理。
此外,如果我们想要实现相同的逻辑但是对于HTTP主体,例如,我们将不得不为此创建另一个函数。
Go有两个很棒的抽象: io.Reader 和 io.Writer 。相反,通过一个文件名,我们可以简单地传递一个 io.Reader 作为 抽象 的数据源。
它是文件吗?一个HTTP正文?字节缓冲区?这并不重要,因为我们仍然会使用相同的 Read 方法。
在我们的例子中,我们甚至可以缓冲输入以逐行读取它。所以,我们可以使用 bufio.Reader 它的 ReadLine 方法:
现在,打开文件本身的责任委托给 count 客户:
使用第二种实现,无论 实际数据源 如何,都可以调用该函数。同时,它将 促进 我们的单元测试,因为我们可以简单地创建一个 bufio.Reader 来自 string :
翻译自: