go语言文件库 go语言 文档

Go语言os标准库常用方法Getwd/Getenv/Chdir

1. os.Getwd()函数

创新互联专注于企业营销型网站、网站重做改版、南丰网站定制设计、自适应品牌网站建设、html5商城网站建设、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为南丰等各大城市提供网站开发制作服务。

原型:func Getwd()(pwd string, err error)

作用:获取当前文件路径

返回:当前文件路径的字符串和一个err信息

示例:

输出:

当前路径: D:ProjectsGomGoLab01

2. os.Getenv()函数

原型:func Getenv(key string) string

作用:获取系统环境变量的值

参数:key - 系统环境变量名

返回:系统环境变量的值

示例:

输出:

环境变量GOPATH的值是: D:/Projects/Go

3. os.Chdir()函数

原型:func Chdir(dir string) error

作用:将当前文件路径改变为目标路径(非真实改变)

参数:dir - 目标路径(即改变之后的路径)

返回:修改成功,返回 nil;修改失败(如:目标路径不存在的情况),返回错误信息。

示例一:

输出:

起始路径: D:ProjectsGomGoLab01

修改后的路径: D:ProjectsGoDemo02

示例二:

输出:

起始路径: D:ProjectsGomGoLab01

error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.

注:文件路径,Window 系统下默认是“”,写在代码中时要用“”或“/”代替。

如何在golang 中调用c的静态库或者动态库

Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.

举例说明一下. 下面是一个Go语言包, 包含了两个函数 -- Random 和 Seed -- 是C语言库中random和srandom函数的马甲.

package rand

/*

#include stdlib.h

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我们来看一下这里都有什么内容. 开始是一个包的导入语句.

rand包导入了"C"包, 但你会发现在Go的标准库里没有这个包. 那是因为C是一个"伪包", 一个为cgo引入的特殊的包名, 它是C命名空间的一个引用.

rand 包包含4个到C包的引用: 调用 C.random和C.srandom, 类型转换 C.uint(i)还有引用语句.

Random函数调用libc中的random函数, 然后回返结果. 在C中, random返回一个C类型的长整形值, cgo把它轮换为C.long. 这个值必需转换成Go的类型, 才能在Go程序中使用. 使用一个常见的Go类型转换:

func Random() int { return int(C.random()) }

这是一个等价的函数, 使用了一个临时变量来进行类型转换:

func Random() int { var r C.long = C.random() return int(r) }

Seed函数则相反. 它接受一个Go语言的int类型, 转换成C语言的unsigned int类型, 然后传递给C的srandom函数.

func Seed(i int) { C.srandom(C.uint(i)) }

需要注意的是, cgo中的unsigned int类型写为C.uint; cgo的文档中有完整的类型列表.

这个例子中还有一个细节我们没有说到, 那就是导入语句上面的注释.

/*

#include stdlib.h

*/ import "C"

Cgo可以识别这个注释, 并在编译C语言程序的时候将它当作一个头文件来处理. 在这个例子中, 它只是一个include语句, 然而其实它可以是使用有效的C语言代码. 这个注释必需紧靠在import "C"这个语句的上面, 不能有空行, 就像是文档注释一样.

Strings and things

与Go语言不同, C语言中没有显式的字符串类型. 字符串在C语言中是一个以0结尾的字符数组.

Go和C语言中的字符串转换是通过C.CString, C.GoString,和C.GoStringN这些函数进行的. 这些转换将得到字符串类型的一个副本.

下一个例子是实现一个Print函数, 它使用C标准库中的fputs函数把一个字符串写到标准输出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中进行的内存分配是不能被Go语言的内存管理器感知的. 当你使用C.CString创建一个C字符串时(或者其它类型的C语言内存分配), 你必需记得在使用完后用C.free来释放它.

调用C.CString将返回一个指向字符数组开始处的指错, 所以在函数退出前我们把它转换成一个unsafe.Pointer(Go中与C的void 等价的东西), 使用C.free来释放分配的内存. 一个惯用法是在分配内存后紧跟一个defer(特别是当这段代码比较复杂的时候), 这样我们就有了下面这个Print函数:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

构建 cgo 包

如果你使用goinstall, 构建cgo包就比较容易了, 只要调用像平常一样使用goinstall命令, 它就能自动识别这个特殊的import "C", 然后自动使用cgo来编译这些文件.

如果你想使用Go的Makefiles来构建, 那在CGOFILES变量中列出那些要用cgo处理的文件, 就像GOFILES变量包含一般的Go源文件一样.

rand包的Makefile可以写成下面这样:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后输入gomake开始构建.

更多 cgo 的资源

cgo的文档中包含了关于C伪包的更多详细的说明, 以及构建过程. Go代码树中的cgo的例子给出了更多更高级的用法.

一个简单而又符合Go惯用法的基于cgo的包是Russ Cox写的gosqlite. 而Go语言的网站上也列出了更多的的cgo包.

最后, 如果你对于cgo的内部是怎么运作这个事情感到好奇的话, 去看看运行时包的cgocall.c文件的注释吧.

GO语言(三十):访问关系型数据库(上)

本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。

您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数。

在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。

首先,为您要编写的代码创建一个文件夹。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。

3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。

运行go mod init命令,为其提供新代码的模块路径。

此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。

注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。

GO语言(二十五):管理依赖项(上)

GO语言(二十六):管理依赖项(中)

GO语言(二十七):管理依赖项(下)

接下来,您将创建一个数据库。

在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。

您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。

这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。

1、打开一个新的命令提示符。

在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。

2、在mysql命令提示符下,创建一个数据库。

3、切到您刚刚创建的数据库,以便您可以添加表。

4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tables.sql 的文件来保存用于添加表的 SQL 脚本。

将以下 SQL 代码粘贴到文件中,然后保存文件。

在此 SQL 代码中:

(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。

(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。

(3)添加带有值的四行。

5、在mysql命令提示符下,运行您刚刚创建的脚本。

您将使用以下形式的source命令:

6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。

接下来,您将编写一些 Go 代码进行连接,以便进行查询。

现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。

找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。

1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。

2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。

3、请注意驱动程序的包名称 - 此处为github.com/go-sql-driver/mysql.

4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 main.go 保存在您之前创建的数据访问目录中。

5、进入main.go,粘贴以下代码导入驱动包。

在此代码中:

(1)将您的代码添加到main包中,以便您可以独立执行它。

(2)导入 MySQL 驱动程序github.com/go-sql-driver/mysql。

导入驱动程序后,您将开始编写代码以访问数据库。

现在编写一些 Go 代码,让您使用数据库句柄访问数据库。

您将使用指向结构的指针sql.DB,它表示对特定数据库的访问。

编写代码

1、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。

在此代码中:

(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。

该Config结构使代码比连接字符串更容易阅读。

(4)调用sql.Open 初始化db变量,传递 FormatDSN。

(5)检查来自 的错误sql.Open。例如,如果您的数据库连接细节格式不正确,它可能会失败。

为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。

(6)调用DB.Ping以确认连接到数据库有效。在运行时, sql.Open可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。

(7)检查来自Ping的错误,以防连接失败。

(8)Ping如果连接成功,则打印一条消息。

文件的顶部现在应该如下所示:

3、保存 main.go。

1、开始跟踪 MySQL 驱动程序模块作为依赖项。

使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。

2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。

在 Linux 或 Mac 上:

在 Windows 上:

3、在包含 main.go 的目录中的命令行中,通过键入go run来运行代码。

连接成功了!

接下来,您将查询一些数据。

go语言 一个主package包引入同级目录下go文件包编译出错!!

go语言 一个主package包引入同级目录下go文件包编译出错是设置错误造成的,解决方法为:

1、先使用import "strings"导入strings库。

2、HasPrefix 判断字符串 s 是否以 prefix 开头。

3、HasSuffix 判断字符串 s 是否以 suffix 结尾。

4、可以看看判断的代码。

5、在cmd下运行一下go run test.go,看看如下结果。

6、Contains 判断字符串 s 是否包含 substr,也就是判断一下S是否在strings中。

7、在cmd下运行go run test.go看看结果。

Go语言文件操作

本文主要介绍了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。


文章名称:go语言文件库 go语言 文档
URL标题:http://scyanting.com/article/doceojc.html