Go的研习笔记day-2

1、Go之runtime(Java中的虚拟机)

runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。

垃圾回收器 Go 拥有简单却高效的标记-清除回收器(类比我之前的文章其实标记-清除会导致大量内存碎片,并且当大对象分配的时候无足够内存)。

2、Go之解释器

Go 语言能在 REPL(read-eval-print loop)编程环境下实现,因为 Go 具有像动态语言那样快速编译的能力.比如igo

3、Go的开发环境

Sublime Text 是一个革命性的跨平台(Linux、Mac OS X、Windows)文本编辑器,它支持编写非常多的编程语言代码。对于 Go 而言,它有一个插件叫做 GoSublime 来支持代码补全和代码模版。
IntelliJ Idea Plugin 是一个 IntelliJ IDEA 的插件,具有很好的操作体验和代码补全功能。
LiteIDE 这是一款专门针对 Go 开发的集成开发环境,在编辑、编译和运行 Go 程序和项目方面都有非常好的支持。同时还包括了对源代码的抽象语法树视图和一些内置工具(此开发环境由国人 vfc 大叔开发)。
GoClipse 是一款 Eclipse IDE 的插件,拥有非常多的特性以及通过 GoCode 来实现代码补全功能。
如果你对集成开发环境都不是很熟悉,那就使用 LiteIDE 吧,另外使用 GoClipse 或者 IntelliJ Idea Plugin 也可以。
⚠️:现在大家更加偏向goland进行开发。

4、Go之调试器

目前可用的调试器是 gdb,最新版均以内置在集成开发环境 LiteIDE 和 GoClipse 中,但是该调试器的调试方式并不灵活且操作难度较大。一个非常好的入手点
不使用调试器:可以通过控制打印信息来判断。

  • 在合适的位置使用打印语句输出相关变量的值(print/println 和 fmt.Print/fmt.Println/fmt.Printf)
  • 在 fmt.Printf 中使用下面的说明符来打印有关变量的相关信息:
  • %+v 打印包括字段在内的实例的完整信息
  • %#v 打印包括字段和限定类型名称在内的实例的完整信息
  • %T 打印某个类型的完整说明
  • 使用 panic 语句来获取栈跟踪信息(直到 panic 时所有被调用函数的列表)
  • 使用关键字 defer 来跟踪代码执行过程

5、Go的编译和运行

go build 编译自身包和依赖包
go install 编译并安装自身包和依赖包
在大多数 IDE 中,每次构建程序之前都会自动调用源码格式化工具 gofmt 并保存格式化后的源文件。如果构建成功则不会输出任何信息,而当发生编译时错误时,则会指明源码中具体第几行出现了什么错误,如:a declared and not used。一般情况下,你可以双击 IDE 中的错误信息直接跳转到发生错误的那一行。
如果程序执行一切顺利并成功退出后,将会在控制台输出 Program exited with code 0。

2019-9-28日补充:使用go build helloWorld.go,然后./helloWorld 。如果不使用上面方式可以使用 go run helloWorld.go包含了编译的build工作

6、格式化代码

在命令行输入 gofmt –w program.go 会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数 -w 则只会打印格式化后的结果而不重写文件);gofmt -w *.go 会格式化并重写所有 Go 源文件;gofmt map1 会格式化并重写 map1 目录及其子目录下的所有 Go 源文件。
gofmt 也可以通过在参数 -r 后面加入用双引号括起来的替换规则实现代码的简单重构,规则的格式:<原始内容> -> <替换内容>。
在这里插入图片描述
去掉没有意义的括号、或者将源文件多余的len(a)去掉,源文件中符合条件的函数参数调换位置
在这里插入图片描述
在这里插入图片描述

7、生成代码文档

go doc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文档。
一般用法
go doc package 获取包的文档注释,例如:go doc fmt 会显示使用 godoc 生成的 fmt 包的文档注释。
go doc package/subpackage 获取子包的文档注释,例如:go doc container/list。
go doc package function 获取某个函数在某个包中的文档注释,例如:go doc fmt Printf 会显示有关 fmt.Printf() 的使用说明。
这个工具只能获取在 Go 安装目录下 …/go/src 中的注释内容。此外,它还可以作为一个本地文档浏览 web 服务器。在命令行输入 godoc -http=:6060,然后使用浏览器打开 http://localhost:6060 后,你就可以看到本地文档浏览服务器提供的页面。
godoc 也可以用于生成非标准库的 Go 源码文件的文档注释

8、Go的其他工具

go install 是安装 Go 包的工具,类似 Ruby 中的 rubygems。主要用于安装非标准库的包文件,将源代码编译成对象文件。
go fix 用于将你的 Go 代码从旧的发行版迁移到最新的发行版,它主要负责简单的、重复的、枯燥无味的修改工作,如果像 API 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代码。go fix 之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输出相关的文件名称。
go test 是一个轻量级的单元测试框架

9、性能对比(性能资料

  • 比较 Go 和 Python 在简单的 web 服务器方面的性能,单位为传输量每秒
    原生的 Go http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。在 Python 中被广泛使用的 tornado 异步服务器和框架在 web 环境下要比 web.py 快很多,Go 大概只比它快 1.2 至 1.5 倍
  • Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python 3 快 25 倍左右,少占用三分之二的内存,但比 Python 大概多写一倍的代码
  • C++、Java、Go 和 Scala
    Go 的编译速度要比绝大多数语言都要快,比 Java 和 C++ 快 5 至 6 倍,比 Scala 快 10 倍。
    Go 的二进制文件体积是最大的(每个可执行文件都包含 runtime)。
    在最理想的情况下,Go 能够和 C++ 一样快,比 Scala 快 2 至 3 倍,比 Java 快 5 至 10 倍。
    Go 在内存管理方面也可以和 C++ 相媲美,几乎只需要 Scala 所使用的一半,是Java的五分之一左右。
    Go 和 Scala 之间具有更多的可比性(都使用更少的代码),而 C++ 和 Java 都使用非常冗长的代码。

10、与其他语言进行交互

  • 与C进行交互
    工具 cgo 提供了对 FFI(外部函数接口)的支持,能够使用 Go 代码安全地调用 C 语言库,你可以访问 cgo 文档主页:http://golang.org/cmd/cgo。cgo 会替代 Go 编译器来产生可以组合在同一个包中的 Go 和 C 代码。在实际开发中一般使用 cgo 创建单独的 C 代码包。
    如果你想要在你的 Go 程序中使用 cgo,则必须在单独的一行使用 import “C” 来导入,一般来说你可能还需要 import “unsafe”
    然后,你可以在 import “C” 之前使用注释(单行或多行注释均可)的形式导入 C 语言库(甚至有效的 C 语言代码),它们之间没有空行,例如:
    在这里插入图片描述
    名称 “C” 并不属于标准库的一部分,这只是 cgo 集成的一个特殊名称用于引用 C 的命名空间。在这个命名空间里所包含的 C 类型都可以被使用,例如 C.uint、C.long 等等,还有 libc 中的函数 C.random() 等也可以被调用。
    当你想要使用某个类型作为 C 中函数的参数时,必须将其转换为 C 中的类型,反之亦然,例如:
    在这里插入图片描述
    下面的 2 个 Go 函数 Random() 和 Seed() 分别调用了 C 中的 C.random() 和 C.srandom()。
    在这里插入图片描述
    C 当中并没有明确的字符串类型,如果你想要将一个 string 类型的变量从 Go 转换到 C 时,可以使用 C.CString(s);同样,可以使用 C.GoString(cs) 从 C 转换到 Go 中的 string 类型。
    Go 的内存管理机制无法管理通过 C 代码分配的内存。
    开发人员需要通过手动调用 C.free 来释放变量的内存,这一行最好紧跟在使用 C 代码创建某个变量之后,这样就不会忘记释放内存了
    在这里插入图片描述
    完整的示例:
    在这里插入图片描述
  • 构建 cgo 包
    在这里插入图片描述
  • 与 C++ 进行交互
    SWIG(简化封装器和接口生成器)支持在 Linux 系统下使用 Go 代码调用 C 或者 C++ 代码。这里有一些使用 SWIG 的注意事项:
    编写需要封装的库的 SWIG 接口。
    SWIG 会产生 C 的存根函数。
    这些库可以使用 cgo 来调用。
    相关的 Go 文件也可以被自动生成。
    这类接口支持方法重载、多重继承以及使用 Go 代码实现 C++ 的抽象类。
    目前使用 SWIG 存在的一个问题是它无法支持所有的 C++ 库,比如说它就无法解析 TObject.h。
发布了213 篇原创文章 · 获赞 258 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/wolf_love666/article/details/97645192