-
Go 语言中的包
在 Go 语言的错误处理中我们提到了 errors 包,当时没有详细的介绍。本文就来详细的介绍一下 Go 语言中包相关的概念。 和大部分语言一致,Go 语言也是支持调用其它文件中的 Go 代码的。Go 语言是现这一功能则是通过包来实现的。而实现包的功能则是通过关键字 package 来实现的,使用 package 来声明代码所在的包。 1. 基本概念 Go 语言中一般使用文件所在的文件名来命名自己的包名,这样层次清晰便于管理。其中包名定义的注意事项如下: 包名一般都是全小写; 包名…
-
Go 语言的并发
Go 语言中的多线程操作是其语言的一大特色,它具有其它语言无法比拟的,可以近乎无限开启的线程。在 Go 语言中被称之为 goroutine ,它是线程的轻量级实现。Go 语言的并发广泛的应用在服务器性能调优的场景中,这也是越来越多的游戏服务器开发都在往 Go 语言倾斜的原因之一。 1.Go 语言的 goroutine 在 Go 语言中使用 go 关键字来创建 goroutine ,形如go 函数名()的形式去创建。每一个 goroutine 必须是一个函数,这个函数也可以是匿名函数…
-
Go 语言中的错误和异常处理
在 Go 语言中没有与 Java 或者 .NET 类似的异常处理机制。Go 语言的开发者认为类似的异常处理已经被过多的使用了,这样的异常机制过度依赖上层代码对异常的处理,如果上层代码对异常的处理不到位会使程序出一些不易排查的BUG。所以为了让开发者能够重视并正确的处理每一个可能会出现异常的函数,Go语言采用返回值的形式来返回错误。这一机制,既可以让开发者真正理解错误处理的含义,也可以大大降低程序的复杂度。 1.error 接口 error 是系统自带的一个接口类型的自定义类型。 代…
-
Go 语言函数式编程
本文主要介绍 Go 语言的另一大编程特性——函数式编程。函数式编程的基础特点为: 函数是一等公民,即函数可以做为变量。 纯函数,即函数内的操作不可影响到函数外。 Go 语言的函数式编程无需遵循第二点,这一特性为 Go 语言的函数式编程带来了更大的灵活性。 1. 编程示例 接下来我们来分别展示用函数式编程和普通编程方式来实现一个累加器,即输出 1+2+3+…+100 的值。 普通方式实现: 代码块 1 func main() { 2 a := 0 3 …
-
Go 语言中的 nil
nil 是 Go 语言中内置的一个标识符,有人会把它当作其它语言中的NULL,这个是不准确的。本文就来介绍一下 Go 语言中的 nil 的特点。 1. nil 是特殊的零值 在 Go 语言中,任何一个变量在声明之后会自动被赋予一个零值。数值类型的变量零值为0,字符串为"",而指针、切片、map、通道、函数和接口的零值就是nil。 代码示例 代码块 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main()…
-
Go 语言类型的内嵌
在 Go 语言中的类型是可以直接内嵌到结构体中的,可以看作是一个没有属性名的属性。同时接口中也可以内嵌接口,并且只能内嵌接口。本文就来讲解以下 Go 语言如何使用内嵌类型。 1. 结构体内嵌类型 结构体中内嵌类型在开发中用的并不多,这只是一个延伸特性。意味着结构体在定义属性字段的时候可以只写类型,不写属性名,但是一个类型只能写一个,不然结构体会无法识别你调用的时候使用的是哪个字段,这种只写类型不写属性名的属性被称为匿名字段。 代码示例: 代码块 1 package main 2 …
-
Go 语言中的接口
在所有编程语言中,接口都是一些方法的集合,通常都是"类"们都需要实现的一些公共方法。使这些"类"在使用过程中多了一层抽象。在使用接口时无需在意这些方法是如何实现的,只需在意这个接口中的方法本身。Go 语言提倡面向接口编程,一来增强代码的可读性,二来可以使代码的模块之间的关系变得更加清晰、边界更加明显。本文就来介绍一下 Go 语言中的接口。 1. 接口定义 在 Go 语言中,接口也是一个数据类型,该类型使用结构 interface{...} 来定义。 代码示例: 代码块 1 var…
-
Go 语言中的结构体和“面向对象”
本文主要来讲解一下 Go 语言的结构体数据类型,以及 Go 语言中的"面向对象",为什么要加双引号呢?因为 Go 语言中没有明确的面向对象的概念,当然也没有明确的面向过程的概念。面向哪一方面编程完全取决于你如何使用,如果你想要面向对象编程,Go 语言中提供了相对应的解决方案来模拟面向对象。 1. 结构体类型 想要模拟面向对象就首先要了解一下 Go 语言中的结构体类型。当你需要两个以上的基本数据类型或自定义类型来声明定义函数的时候,你就可以使用结构体。结构体变量使用struct{..…
-
Go 语言拓展以有类型
在开发中,仅仅使用 Go 语言自带的变量是无法满足我们的业务需求的,就算勉强能满足,对我们整个项目代码后期的维护和其可读性,都会带来很大的不便。所以几乎所有语言都支持自定义数据类型,用于拓展已有的数据类型来适应日新月异的开发场景。在 Go 语言中可以使用 type 关键字自定义数据类型。 1. 自定义复杂类型 我们可以使用type Name Type去自定义一个全新的数据类型。这个类型的变量就使用Name来声明。通常type用于将一个复杂的数据类型定义为一个全新的数据类型,便于后续…
-
Go 语言中的 range
在线程不安全的 map 中我们学习了 map 的遍历,里面使用了一个叫 range 的关键字来对 map 进行遍历操作。当时还提到了切片和数组都可以使用这个方法遍历。本文就来详细学习一下 range 关键字的用法。 Tips:本文提及的 map 均是线程不安全的 map。线程安全的 map 及其遍历方法参照 Go 语言中的map 一文。 1. 基本用法 range 可以用来遍历的对象有数组、切片、map、字符串以及通道。遍历的对象不同,range 的返回值也会有所不同。遍历数组、切…