Go语言
本专栏主要介绍Go语言编程开发
FLy_鹏程万里
国内网络安全研究员,专注于Web渗透、移动安全、代码审计、应急响应、内网渗透、区块链安全、云安全等研究方向,擅长渗透测试、红蓝对抗、内网渗透、云安全、区块链安全。
展开
-
Windows 下GO语言开发环境搭建+LiteID配置
安装GO语言安装包下载Go语言安装包:https://golang.google.cn/dl/安装Go语言安装包之后一直下一步就好,默认的安装路径为:C:\GO配置GO语言环境变量配置环境变量PATH:配置环境变量“GOROOT”如果你使用的默认的安装目录,上面的环境变量不用配置,如果你之前修改了安装路径那么这里就需要修改环境变量。指定GO工作目录这里根据自己想要设置的目录进行设置命令行对环境变量...原创 2018-07-03 22:03:49 · 1704 阅读 · 0 评论 -
GO语言—————7.1 声明和初始化
7.1 声明和初始化7.1.1 概念数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。数组的编译时值初始化是按照数组顺序完成的(如下)。注意事项 如果我们想让数组元素类...转载 2018-07-01 21:36:39 · 730 阅读 · 0 评论 -
GO语言————6.12 通过内存缓存来提升性能
6.12 通过内存缓存来提升性能当在进行大量的计算时,提升性能最直接有效的一种方式就是避免重复计算。通过在内存中缓存和重复利用相同计算的结果,称之为内存缓存。最明显的例子就是生成斐波那契数列的程序(详见第 6.6 和 6.11 节):要计算数列中第 n 个数字,需要先得到之前两个数的值,但很明显绝大多数情况下前两个数的值都是已经计算过的。即每个更后面的数都是基于之前计算结果的重复计算,正如示例 6...转载 2018-07-01 21:36:25 · 1094 阅读 · 0 评论 -
GO语言————6.11 计算函数执行时间
6.11 计算函数执行时间有时候,能够知道一个计算执行消耗的时间是非常有意义的,尤其是在对比和基准测试中。最简单的一个办法就是在计算开始之前设置一个起始时候,再由计算结束时的结束时间,最后取出它们的差值,就是这个计算所消耗的时间。想要实现这样的做法,可以使用 time 包中的 Now() 和 Sub 函数:start := time.Now()longCalculation()end := t...转载 2018-07-01 21:36:15 · 522 阅读 · 0 评论 -
GO语言————6.10 使用闭包调试
6.10 使用闭包调试当您在分析和调试复杂的程序时,无数个函数在不同的代码文件中相互调用,如果这时候能够准确地知道哪个文件中的具体哪个函数正在执行,对于调试是十分有帮助的。您可以使用 runtime 或 log 包中的特殊函数来实现这样的功能。包 runtime中的函数 Caller() 提供了相应的信息,因此可以在需要的时候实现一个 where() 闭包函数来打印函数执行的位置:where :=...转载 2018-07-03 22:03:26 · 617 阅读 · 0 评论 -
GO语言————6.9 应用闭包:将函数作为返回值
6.9 应用闭包:将函数作为返回值在程序 function_return.go 中我们将会看到函数 Add2 和 Adder 均会返回签名为 func(b int) int 的函数:func Add2() (func(b int) int)func Adder(a int) (func(b int) int)函数 Add2 不接受任何参数,但函数 Adder 接受一个 int 类型的整数作为参数...转载 2018-06-30 22:47:37 · 853 阅读 · 0 评论 -
GO语言————6.8 闭包
6.8 闭包当我们不希望给函数起名字的时候,可以使用匿名函数,例如:func(x, y int) int { return x + y }。这样的一个函数不能够独立存在(编译器会返回错误:non-declaration statement outside function body),但可以被赋值于某个变量,即保存函数的地址到变量中:fplus := func(x, y int) int { re...转载 2018-06-30 22:47:31 · 450 阅读 · 0 评论 -
GO语言————6.7 将函数作为参数
6.7 将函数作为参数函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。下面是一个将函数作为参数的简单例子(function_parameter.go):package mainimport ( "fmt")func main() { callback(1, Add)}func Add(a, b int) { fmt.Printf("The sum...转载 2018-06-30 22:47:25 · 2375 阅读 · 0 评论 -
GO语言————6.6 递归函数
6.6 递归函数当一个函数在其函数体内调用自身,则称之为递归。最经典的例子便是计算斐波那契数列,即前两个数为1,从第三个数开始每个数均为前两个数之和。数列如下所示:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …下面的程序可用于生成该数列(示例 6.13 f...转载 2018-06-30 22:47:20 · 615 阅读 · 0 评论 -
Go语言————7.2 切片
7.2 切片7.2.1 概念切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。切片是可索引的,并且可以由 l...转载 2018-07-01 21:36:46 · 733 阅读 · 0 评论 -
Go语言————7.3 For-range 结构
7.3 For-range 结构这种构建方法可以应用于数组和切片:for ix, value := range slice1 { ...}第一个返回值 ix 是数组或者切片的索引,第二个是在该索引位置的值;他们都是仅在 for 循环内部可见的局部变量。value 只是 slice1 某个索引位置的值的一个拷贝,不能用来修改 slice1 该索引位置的值。示例 7.9 slices_forran...转载 2018-07-01 21:36:52 · 1042 阅读 · 0 评论 -
Go语言————7.4 切片重组(reslice)
7.4 切片重组(reslice)我们已经知道切片创建的时候通常比相关数组小,例如:slice1 := make([]type, start_length, capacity)其中 start_length 作为切片初始长度而 capacity 作为相关数组的长度。这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 reslicing,做法如下:slice1 = s...转载 2018-07-01 21:37:00 · 734 阅读 · 0 评论 -
GO语言————8.6 将 map 的键值对调
8.6 将 map 的键值对调这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。示例 8.7 invert_map.go:package mainimport ( "fmt")var ( barVal = map[string]int{"alpha": 34, "bravo": 5...转载 2018-07-03 22:03:42 · 1251 阅读 · 0 评论 -
GO语言————8.5 map 的排序
8.5 map 的排序map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序(详见第 8.3 节)。如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序(使用 sort 包,详见第 7.6.6 节),然后可以使用切片的 for-range 方法打印出所有的 key 和 value。下面有一个示例:示例 8.6 sort_map.go:// ...转载 2018-07-03 22:03:37 · 921 阅读 · 0 评论 -
GO语言————8.4 map 类型的切片
8.4 map 类型的切片假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配 切片中每个 map 元素(参见下面的例子 8.4)。示例 8.4 maps_forrange2.go:package mainimport "fmt"func main() { // Version A: items := make([]map[int]in...转载 2018-07-03 22:03:31 · 1741 阅读 · 0 评论 -
GO语言————8.3 for-range 的配套用法
8.3 for-range 的配套用法可以使用 for 循环构造 map:for key, value := range map1 { ...}第一个返回值 key 是 map 中的 key 值,第二个返回值则是该 key 对应的 value 值;这两个都是仅 for 循环内部可见的局部变量。其中第一个返回值key值是一个可选元素。如果你只关心值,可以这么使用:for _, value := ...转载 2018-07-03 22:03:09 · 734 阅读 · 0 评论 -
GO语言————8.2 测试键值对是否存在及删除元素
8.2 测试键值对是否存在及删除元素测试 map1 中是否存在 key1:在例子 8.1 中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1。如果 map 中不存在 key1,val1 就是一个值类型的空值。这就会给我们带来困惑了:现在我们没法区分到底是 key1 不存在还是它对应的 value 就是空值。为了解决这个问题,我们可以这么用:val...转载 2018-07-03 22:03:00 · 1814 阅读 · 0 评论 -
GO语言————8.1 MAP声明、初始化和make
8.0 Mapmap 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key,对应的 value 可以迅速定位。map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable 等。8.1 声明、初始化和 make8.1.1 ...转载 2018-07-01 21:37:23 · 12521 阅读 · 0 评论 -
GO语言————7.6 字符串、数组和切片的应用
7.6 字符串、数组和切片的应用7.6.1 从字符串生成字节切片假设 s 是一个字符串(本质上是一个字节数组),那么就可以直接通过 c := []byte(s) 来获取一个字节的切片 c。另外,您还可以通过 copy 函数来达到相同的目的:copy(dst []byte, src string)。同样的,还可以使用 for-range 来获得每个元素(Listing 7.13—for_string...转载 2018-07-01 21:37:14 · 466 阅读 · 0 评论 -
GO语言————7.5 切片的复制与追加
7.5 切片的复制与追加如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 函数和向切片追加新元素的 append 函数。示例 7.12 copy_append_slice.gopackage mainimport "fmt"func main() { sl_from := []int{1, 2, 3} sl_to :=...转载 2018-07-01 21:37:07 · 1131 阅读 · 0 评论 -
GO语言————6.5 内置函数
6.5 内置函数Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。以下是一个简单的列表,我们会在后面的章节中对它们进行逐个深入的讲解。...转载 2018-06-30 22:47:14 · 365 阅读 · 0 评论 -
GO语言————6.4 defer 和追踪
6.4 defer 和追踪关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为 return 语句同样可以包含一些操作,而不是单纯地返回某个值)。关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源。示例 6.8 defer...转载 2018-06-30 22:47:09 · 215 阅读 · 0 评论 -
GO语言————6.3 传递变长参数
6.3 传递变长参数如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。func myFunc(a, b, arg ...int) {}这个函数接受一个类似某个类型的 slice 的参数(详见第 7 章),该参数可以通过第 5.4.4 节中提到的 for 循环结构迭代。示例函数和调用:func Greeting(p...转载 2018-06-30 22:47:04 · 1300 阅读 · 0 评论 -
GO语言————4.6 字符串
4.6 字符串字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。UTF-8 是被广泛使用的编码格式,是文本文件的标准编码,其它包括 XML 和 JSON 在内,也都使用该编码。由于该编码对占用字节长度的不定性,Go 中的字符串也可能根据需要占用 1 至 4 个字节(示例见第 4.6 节),这与其它语言如 C++、Java 或...转载 2018-06-29 09:54:22 · 507 阅读 · 0 评论 -
GO语言————4.5 基本类型和运算符
4.5 基本类型和运算符我们将在这个部分讲解有关布尔型、数字型和字符型的相关知识。表达式是一种特定的类型的值,它可以由其它的值以及运算符组合而成。每个类型都定义了可以和自己结合的运算符集合,如果你使用了不在这个集合中的运算符,则会在编译时获得编译错误。一元运算符只可以用于一个值的操作(作为后缀),而二元运算符则可以和两个值或者操作数结合(作为中缀)。只有两个类型相同的值才可以和二元运算符结合,另外...转载 2018-06-26 20:13:41 · 533 阅读 · 0 评论 -
GO语言————4.4 变量
4.4 变量4.4.1 简介声明变量的一般形式是使用 var 关键字:var identifier type。需要注意的是,Go 和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。Go 为什么要选择这么做呢?首先,它是为了避免像 C 语言中那样含糊不清的声明形式,例如:int* a, b;。在这个例子中,只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书...转载 2018-06-26 20:13:33 · 349 阅读 · 0 评论 -
GO语言————4.3常量
4.3 常量常量使用关键字 const 定义,用于存储不会改变的数据。存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的定义格式:const identifier [type] = value,例如:const Pi = 3.14159在 Go 语言中,你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。显式类型定义: const b s...转载 2018-06-26 20:13:24 · 332 阅读 · 0 评论 -
GO语言————4.2 Go程序的基本结构和要素
4.2 Go 程序的基本结构和要素示例 4.1 hello_world.gopackage mainimport "fmt"func main() { fmt.Println("hello, world")}4.2.1 包的概念、导入与可见性包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。如同其它一些编程语言中的类库或命...转载 2018-06-26 20:13:15 · 573 阅读 · 0 评论 -
GO语言————4.1 文件名、关键字与标识符
4.1 文件名、关键字与标识符Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go 。文件名不包含空格或其他特殊字符。一个源文件可以包含任意多行的代码,Go 本身没有对源文件的大小进行限制。你会发现在 Go 代码中的几乎所有东西都有一个名称或标识符。另...转载 2018-06-26 20:13:06 · 448 阅读 · 0 评论 -
GO语言————3、编辑器、集成开发环境与其它工具
无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家。点这里可以跳转到教程!3.1 Go 开发环境的基本要求这里有一个你可以期待你用来开发 Go 的集成开发环境有哪些特性的列表,从而替代你使用文本编辑器写代码和命令行编译与链接程序的方式。...转载 2018-06-26 20:12:57 · 10268 阅读 · 0 评论 -
GO语言————2、GO语言环境安装
GO语言支持一下系统LinuxFreeBSDMac OS X(也称为 Darwin)Window安装包下载地址为:https://golang.org/dl/。如果打不开可以使用这个地址:https://golang.google.cn/dl/。各个系统对应的包名:UNIX/Linux/Mac OS X, 和 FreeBSD 安装以下介绍了在UNIX/Linux/Mac OS X, 和 FreeB...转载 2018-06-23 14:09:16 · 1272 阅读 · 0 评论 -
GO语言————4.7 strings和strconv 包
4.7 strings 和 strconv 包作为一种基本数据结构,每种语言都有一些对于字符串的预定义处理函数。Go 中使用 strings 包来完成对字符串的主要操作。4.7.1 前缀和后缀HasPrefix 判断字符串 s 是否以 prefix 开头:strings.HasPrefix(s, prefix string) boolHasSuffix 判断字符串 s 是否以 suffix 结尾:...转载 2018-06-29 09:54:30 · 392 阅读 · 0 评论 -
GO语言————4.8 时间和日期
4.8 时间和日期time 包为我们提供了一个数据类型 time.Time(作为值使用)以及显示和测量时间和日期的功能函数。当前时间可以使用 time.Now() 获取,或者使用 t.Day()、t.Minute() 等等来获取时间的一部分;你甚至可以自定义时间格式化字符串,例如: fmt.Printf("%02d.%02d.%4d\n", t.Day(), t.Month(), t.Year()...转载 2018-06-29 09:54:36 · 2223 阅读 · 0 评论 -
GO语言————4.9、指针
4.9 指针不像 Java 和 .NET,Go 语言为程序员提供了控制数据结构的指针的能力;但是,你不能进行指针运算。通过给予程序员基本内存布局,Go 语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这些对构建运行良好的系统是非常重要的:指针对于性能的影响是不言而喻的,而如果你想要做的是系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。由于各种原因,指针对于使用面向对象编程的...转载 2018-06-29 09:54:43 · 994 阅读 · 0 评论 -
GO语言————6.2 函数参数与返回值
6.2 函数参数与返回值函数能够接收参数供自己使用,也可以返回零个或多个值(我们通常把返回多个值称为返回一组值)。相比与 C、C++、Java 和 C#,多值返回是 Go 的一大特性,为我们判断一个函数是否正常执行(参考 第 5.2 节)提供了方便。我们通过 return 关键字返回一组值。事实上,任何一个有返回值(单个或多个)的函数都必须以 return 或 panic(参考第 13 章)结尾。...转载 2018-06-30 22:46:59 · 1720 阅读 · 1 评论 -
GO语言————6.1 函数
6.1 函数介绍每一个程序都包含很多的函数:函数是基本的代码块。Go是编译型语言,所以函数编写的顺序是无关紧要的;鉴于可读性的需求,最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。而且,同一个任务(函数)可以被调用多次,有助于代码重用。(事实上,好的...转载 2018-06-30 22:46:53 · 274 阅读 · 0 评论 -
GO语言————5.6 标签与goto
5.6 标签与 gotofor、switch 或 select 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:)结尾的单词(gofmt 会将后续代码自动移至下一行)。示例 5.13 for6.go:(标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母)package mainimport "fmt"func main() {LABEL1: ...转载 2018-06-30 22:46:41 · 4877 阅读 · 0 评论 -
GO语言————5.5 Break 与 continue
5.5 Break 与 continue您可以使用 break 语句重写 for2.go 的代码:示例 5.10 for3.go:for { i = i - 1 fmt.Printf("The variable i is now: %d\n", i) if i < 0 { break }}因此每次迭代都会对条件进行检查(i < 0),以此判断是否需要停止循环。如果退出条件...转载 2018-06-29 09:56:00 · 783 阅读 · 0 评论 -
GO语言————5.4 for 结构
5.4 for 结构如果想要重复执行某些语句,Go 语言中您只有 for 结构可以使用。不要小看它,这个 for 结构比其它语言中的更为灵活。注意事项 其它许多语言中也没有发现和 do while 完全对等的 for 结构,可能是因为这种需求并不是那么强烈。5.4.1 基于计数器的迭代文件 for1.go 中演示了最简单的基于计数器的迭代,基本形式为:for 初始化语句; 条件语句; 修饰语句 {...转载 2018-06-29 09:55:55 · 546 阅读 · 0 评论 -
GO语言————5.3 switch 结构
5.3 switch 结构相比较 C 和 Java 等其它语言而言,Go 语言中的 switch 结构使用上更加灵活。它接受任意形式的表达式:switch var1 { case val1: ... case val2: ... default: ...}变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的...转载 2018-06-29 09:55:48 · 448 阅读 · 0 评论