02 2020 档案
摘要:定义一个中间件类 来计算http请求的时间 public class ResponseTimeMiddleware { // Name of the Response Header, Custom Headers starts with "X-" private const string RESPO
阅读全文
摘要:合适地使用可变参数,可以让代码简单易用,尤其是输入输出类函数,比如日志函数等。 本文主要从4个实例介绍可变参数用法。 程序代码: package main import ( "bytes" "fmt" ) /****************** 1 **************** 定义可参变数函数
阅读全文
摘要:其他类型能够实现接口,函数也可以,本节将对结构体与函数实现接口的过程进行对比。 完整的代码: package main import "fmt" /* 这个接口需要实现 Call() 方法,调用时会传入一个 interface{} 类型的变量,这种类型的变量表示任意类型的值。 */ type Inv
阅读全文
摘要:Go语言支持匿名函数,即在需要使用函数时再定义函数,匿名函数没有函数名只有函数体,函数可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递,这与C语言的回调函数比较类似,不同的是,Go语言支持随时在代码里定义匿名函数。 程序代码: package main import "fmt"
阅读全文
摘要:使用 SQL 语言从数据库中获取数据时,可以对原始数据进行排序(sort by)、分组(group by)和去重(distinct)等操作,SQL 将数据的操作与遍历过程作为两个部分进行隔离,这样操作和遍历过程就可以各自独立地进行设计,这就是常见的数据与操作分离的设计。对数据的操作进行多步骤的处理被
阅读全文
摘要:Go语言中传入与返回参数在调用和返回时都使用值传递,这里需要注意的是指针、切片和 map 等引用型对象在参数传递中不会发生复制,而是将指针进行复制,类似于创建一次引用。 程序实例: package main import "fmt" type Data struct { complax []int
阅读全文
摘要:使用一个数值表示时间中的“秒”值,然后使用 resolveTime() 函数将传入的秒数转换为天、小时和分钟等时间单位。 package main import "fmt" /* 时间常量 */ const ( //定义每分钟的秒数 SecondsPerMinute = 60 //定义每小时的秒数
阅读全文
摘要:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找算法的前提是传入的序列是有序的(降序或升序),并且有一个目标值。二分查找的核心思想是将 n 个元素分成大致相等的两部分,取中间值 a[n/2] 与 x 做比较,如果 x=a[n/2],则找到 x,算法中止,
阅读全文
摘要:package main import "fmt" func main() { array := [...]int32{3, 1, 9, 29, 15} n := len(array) fmt.Println("未排序前:", array) /* 冒泡排序 */ for i := 0; i <= n
阅读全文
摘要:基本写法 Go语言改进了 switch 的语法设计,case 与 case 之间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行,示例代码如下: var str = "hello" //基本用法 switch str { case "good": fmt.Pr
阅读全文
摘要:Go语言中 new 和 make 是两个内置函数,主要用来创建并分配类型的内存。在我们定义变量的时候,可能会觉得有点迷惑,不知道应该使用哪个函数来声明变量,其实他们的规则很简单,new 只分配内存,而 make 只能用于 slice、map 和 channel 的初始化 new 在Go语言中,new
阅读全文
摘要:nil 标识符是不能比较的 package main import "fmt" func main() { fmt.Println(nil == nil) } .\nil.go:6:18: invalid operation: nil == nil (operator == not defined
阅读全文
摘要:在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。 初始化列表 list 的初始化有两种方法:分别是使用 New() 函数和 var 关键字声明,两种方法的初始化效果都是一致的。1) 通过 container/li
阅读全文
摘要:Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的。 需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构
阅读全文
摘要:使用 delete() 函数从 map 中删除键值对 使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下: delete(map, 键) 其中 map 为要删除的 map 实例,键为要删除的 map 中键值对的键。 package main import
阅读全文
摘要:map 的遍历过程使用 for range 循环完成,代码如下: package main import "fmt" func main() { mapNum := make(map[string]int) mapNum["key1"] = 1 mapNum["key2"] = 2 mapNum["
阅读全文
摘要:Go语言中 map 是一种特殊的数据结构,一种元素对(pair)的无序集合,pair 对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。map 这种数据结构在其他编程语言中也称为字典(
阅读全文
摘要:Go语言有个特殊的关键字 range,它可以配合关键字 for 来迭代切片里的每一个元素。当迭代切片时,关键字 range 会返回两个值,第一个值是当前迭代到的索引位置,第二个值是该位置对应元素值的一份副本,如下图所示 需要强调的是,range 返回的是每个元素的副本,而不是直接返回对该元素的引用,
阅读全文
摘要:Go语言的内建函数 append() 可以为切片动态添加元素。不过需要注意的是,在使用 append() 函数为切片动态添加元素时,如果空间不足以容纳足够多的元素,切片就会进行“扩容”,此时新切片的长度会发生改变。 程序代码 package main import "fmt" func main()
阅读全文
摘要:切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。 Go语言中切片的内部结构包含
阅读全文
摘要:运行源码 package main // 导入 fmt 包,打印字符串是需要用到 import "fmt" func main() { //【示例 1】声明二维数组 fmt.Println("声明二维数组") //声明二维数组,两个维度长度分别为4和2 var array [4][2]int //
阅读全文
摘要:程序源码 package main import ( "fmt" // 导入 fmt 包,打印字符串是需要用到 ) func main() { // 声明 main 主函数 var a [3]int // 定义三个整数的数组 fmt.Println(a[0]) // 打印第一个元素 fmt.Prin
阅读全文