随笔分类 - Go
摘要:1.定义 函数是结构化编程的最小单元模式。它将复杂的算法过程分解为若干个较小任务,隐藏相关细节,使程序结构更加清晰,易于维护。函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果。一个函数的声明通常包括关键字func、函数名、分别由圆括号包裹的列表参数和结果列表,以及由花括号包
阅读全文
摘要:在Go语言里面,你不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以消除竞争状态, 还可以使用通道,通过发送和接收需要共享的资源,在goroutine之间做同步。 当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道,并提供了确保同步交换数据的机制。 声明通
阅读全文
摘要:通常程序会被编写为一个顺序执行并完成一个独立任务的代码。 如果没有特别的需求,最好总是这样写代码,因为这种类型的程序通常很容易写,也容易维护。 不过也有一些情况下,并行执行多个任务会有更大的好处。 一个例子是,Web服务需要在各自独立的套接字上同时接收多个数据请求。 每个套接字请求都是独立的,可以完
阅读全文
摘要:相比Erlang,go并未实现严格的并发安全。允许全局变量、指针、引用类型这些非安全内存共享操作,就需要开发人员自行维护数据一致和完整性。Go鼓励使用CSP通道,以通信来代替内存共享,实现并发安全。作为CSP核心,通道(channel)是显式地,要求操作双方必须知道数据类型和具体通道,并不关心另一端
阅读全文
摘要:并发与并行的区别: 并发:逻辑上具备同时处理多个任务的能力。 并行:物理上在同一时刻执行多个并发任务。通常都会说程序是并发设计的,也就是说它允许多个任务同时执行,但实际上并不一定真在同一时刻发生。在单核处理器上,它们能以间隔方式切换执行。而并行则依赖多核处理器等物理设备,让多个任务真正在同一时刻执行
阅读全文
摘要:在声明一个新类型之后,声明一个该类型的方法之前,需要先回答一个问题:这个类型的本质是什么。 如果给这个类型增加或删除某个值,是要创建一个新值,还是要更改当前的值? 如果是要创建一个新值,该类型的方法就使用值接收者。如果是要修改当前值,就使用指针接收者。 这个答案也会影响程序内部传递这个类型的值的方式
阅读全文
摘要:多态是指代码可以根据类型的具体实现采取不同行为的能力。 如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。 标准库里有很好的例子,如io包里实现的流式处理接口。 io包提供了一组构造得非常好得接口和函数,来让代码轻松支持流式数据处理。 只要实现两个接口,就能利用整个io包背
阅读全文
摘要:Go语言是一种静态类型的编程语言。这意味着,编译器需要在编译时知晓程序里每个值的类型。 如果提前知道类型信息,编译器就可以确保程序合理的使用值。 这有助于减少潜在的内存异常和bug,并且使编译器有机会对代码进行一些性能优化,提高执行效率。 值的类型给编译器提供了两部分信息:第一部分,需要分配多少内存
阅读全文
摘要:切片是一种数据结构,这种数据结构便于使用和管理数据集合。 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。 切片的动态增长是通过内置函数append来实现的。这个函数可以快速且高效地增长切片。 还可以通过对切片再次切片来缩小一个切片地大小。 因为切片的底层内存也是在连续中分配的,所以切片还能
阅读全文
摘要:字典是一种数据结构,用于存储一系列无序的键值对。 字典是基于键来存储值。字典功能强大的地方是能够基于键快速检索数据。 键就像索引一样,指向与键关联的值。 1.内部实现 字典是一个集合,可以使用类似处理数组和切片的方式迭代字典中的元素。 但字典是无序的集合,意味着没有办法预测键值对被返回的顺序。 即使
阅读全文
摘要:1.内部实现 在Go语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块。 数组存储的类型可以是内置类型,如整型或字符串,也可以是某种结构类型。 灰格子代表数组里面的元素,每个元素都紧邻另一个元素。 每个元素都属于相同的类型,并且每个元素可以用一个唯一的索引(也称下标或标号
阅读全文
摘要:反射(reflect)让我们能在运行期探知对象地类型信息和内存结构,这从一定程度上弥补了静态语言在动态行为上地不足。和C数据结构一样,Go对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息地。反射操作所需地全部信息都源自接口变量。接口变量除存储自身类型外,还会保存实际对象地类型数据
阅读全文
摘要:Go语言提供了另外一种数据类型,即接口,它把所有具有共性的方法定义在一起,任何其它类型只要实现了这些方法就是实现了这个接口。接口代表一种调用契约,是多个方法声明的集合。在某些动态语言里,接口(interface)也被称作协议(protocol)。准备交互的双方,共同遵守事先约定的规则,使得无须知道对
阅读全文
摘要:方法是与对象实例绑定的特殊函数。方法是面向对象编程的基本概念,用于维护和展示对象的自身状态。对象是内敛的,每个实例都有各自不同的独立特征,以属性和方法来暴露对外通信接口。普通函数则专注于算法流程,通过接收参数来完成特定逻辑算法,并最终返回结果。换句话说,方法是有关联状态的,而函数通常没有。方法和函数
阅读全文
摘要:Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体定义需要使用type和struct语句。struct语句定义一个新的数据类型,结构体中有一个或多个成员。type语句设定了结构体的名称。格式如下:
阅读全文
摘要:Go中字典类型是散列表(hash table)的一个实现,其官方称谓是map。散列表是一个实现了关联数组的数据结构,关联数组是用于表示键值对的无序集合的一种抽象数据类型。Go中称键值对为键-元素对,它把字典中的每个键都看作与其对应的元素的索引,这样的索引再同一个字典值中是唯一的。下面的代码声明了一个
阅读全文
摘要:切片(slice)可以看作一种对数组的包装形式,它包装的数组为该切片的底层数组。反过来讲,切片是针对其底层数组中某个连续片段的描述,下面的代码声明了一个切片类型的变量: var ips = []string{"192.168.1.1","192.168.1.2","192.168.1.3"}与数组不
阅读全文
摘要:数组(array)就是由若干个相同类型的元素组成的序列。 在这条赋值语句中,我们为刚声明的变量ipv4赋值。在这种情况下,变量名右边的类型字面量可以省略。如果它在函数里面,那么关键字var也可以省略,但赋值符号必须由=变为:=。类型字面量[4]uint8表明这个变量的类型长度为4且元素类型为uint
阅读全文
摘要:Go在流程控制方面的特点如下: 没有do和while循环,只有一个更广义的for语句。 switch语句灵活多变,还可以用于类型判断。 if语句和switch语句都可以包含一条初始化子语句。 break语句和continue语句可以后跟一条标签(label)语句,以标识需要终止或继承的代码块。 de
阅读全文
摘要:Go有许多预定义类型,这里简单把它们分为基本类型和高级类型。下面是基本类型列表: Go的基本类型共有18个,其中int和uint的实际宽度会根据计算架构的不同而不同。在386计算架构下,它的宽度为32比特,即4个字节。在amd64计算架构下,它们的宽度为64比特,即8个字节。byte类型可以看作un
阅读全文