go
文章平均质量分 54
浅汐王
这个作者很懒,什么都没留下…
展开
-
Go-30 宕机(panic)--程序终止运行
Go语言的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等,这些运行时错误会引起宕机。宕机不是一件很好的事情,可能造成体验停止、服务中断,就像没有人希望在取钱时遇到 ATM 机蓝屏一样,但是,如果在损失发生时,程序没有因为宕机而停止,那么用户将会付出更大的代价,这种代价可以是金钱、时间甚至生命,因此,宕机有时也是一种合理的止损方法。一般而言,当宕机发生时...原创 2019-11-13 16:56:54 · 332 阅读 · 0 评论 -
Go-29 处理运行时错误
Go语言的错误处理思想及设计包含以下特征:一个可能造成错误的函数,需要返回值中返回一个错误接口(error),如果调用是成功的,错误接口将返回 nil,否则返回错误。 在函数调用后需要检查错误,如果发生错误,则进行必要的错误处理。Go语言没有类似 Java 或 .NET 中的异常处理机制,虽然可以使用 defer、panic、recover 模拟,但官方并不主张这样做,Go语言的设计者认...原创 2019-11-13 16:42:55 · 178 阅读 · 0 评论 -
Go-28 defer详解(延迟执行语句)
Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。关键字 defer 的用法类似于面向对象编程语言 Java和C# 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者关闭...原创 2019-11-07 17:22:55 · 222 阅读 · 0 评论 -
Go-27 可变参数
可变参数类型可变参数是指函数传入的参数个数是可变的,为了做到这点,首先需要将函数定义为可以接受可变参数的类型:func myfunc(args ...int) { for _, arg := range args { fmt.Println(arg) }}上面这段代码的意思是,函数 myfunc() 接受不定数量的参数,这些参数的类型全部是 int,...原创 2019-11-07 16:52:53 · 181 阅读 · 0 评论 -
Go-26 闭包详解(引用了外部变量的匿名函数)
Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说:函数 + 引用环境 = 闭包同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。 ...原创 2019-11-07 15:41:56 · 952 阅读 · 0 评论 -
Go-25 make和new关键字的区别及实现原理
当我们想要在Go语言中初始化一个结构时,其实会使用到两个完全不同的关键字,也就是 make 和 new,同时出现两个用于初始化的关键字对于初学者来说可能会感到非常困惑,不过它们两者却有着完全不同的作用。在Go语言中,make 关键字的主要作用是初始化内置的数据结构,也就是我们在前面提到的数组、切片和 Channel,而当我们想要获取指向某个类型的指针时可以使用 new 关键字,只是知道如何使用 ...原创 2019-11-07 14:10:38 · 1491 阅读 · 0 评论 -
Go-24 nil的使用:空值/零值
Go语言中 nil 是一个预先定义好的标识符,它是许多类型的零值表示,有过其他编程语言开发经验的开发者也许会把 nil 看作其他语言中的 null(NULL),其实这并不是完全正确的,因为Go语言中的 nil 和其他语言中的 null 有很多不同点。nil标识符是不能比较的package mainimport ( "fmt")func main() { fmt....原创 2019-11-06 22:03:59 · 630 阅读 · 0 评论 -
Go-23 列表的使用
列表是一种非连续的存储容器,由多个节点组成,节点通过一些变量记录彼此之间的关系,列表有多种实现方法,如单链表、双链表等。列表的原理可以这样理解:假设 A、B、C 三个人都有电话号码,如果 A 把号码告诉给 B,B 把号码告诉给 C,这个过程就建立了一个单链表结构,如下图所示。 图:三人单向通知电话号码形成单链表结构如果在这个基础上,再...原创 2019-11-06 21:48:58 · 184 阅读 · 0 评论 -
Go-22 如何在并发场景中使用Map
Go语言中的map在并发情况下,只读是线程安全的,同时读写是线程不安全的。下面来看下并发情况下读写 map 时会出现的问题,代码如下:// 创建一个int到int的映射m := make(map[int]int)// 开启一段并发代码go func() { // 不停地对map进行写入 for { m[1] = 1 }}()// 开...原创 2019-11-06 21:17:37 · 167 阅读 · 0 评论 -
Go-21 map元素的删除和清空
Go语言提供了一个内置函数delete(),用于删除容器内的元素。使用 delete() 函数从 map 中删除键值对使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下:delete(map, 键)从 map 中删除一组键值对可以通过下面的代码来完成:scene := make(map[string]int)// 准备map数...原创 2019-11-06 21:04:58 · 2436 阅读 · 0 评论 -
Go-20 遍历Map(访问map中的每一个键值对)
map的遍历过程是使用for range循环完成,代码如下:scene := make(map[string]int)scene["route"] = 66scene["brazil"] = 4scene["china"] = 960for k, v := range scene { fmt.Println(k, v)}遍历对于Go语言很多对象来说都是差不多的,直接使...原创 2019-11-06 20:51:34 · 985 阅读 · 0 评论 -
Go-19 Map映射
Go语言 中 map 是一种特殊的数据结构,一种元素对(pair)的无序集合,pair 对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable 等。Map的概念map 是引用类型,可...原创 2019-11-05 13:35:09 · 119 阅读 · 0 评论 -
Go-18 range关键字:循环迭代切片
我们了解到切片就是多个相同类型元素的连续集合,既然切片是一个集合,那么就可以迭代其中的元素,使用range关键字,它可以配合关键字for来迭代切片中的元素, 示例如下:// 创建一个整型切片// 其长度和容量都是 4 个元素slice := []int{10, 20, 30, 40}// 迭代每一个元素,并显示其值for index, value := range slice { ...原创 2019-11-05 13:20:36 · 250 阅读 · 0 评论 -
Go-17 使用append()为切片添加元素
Go语言的内建函数append()可以为切片动态的添加元素,示例如下:var a []inta = append(a, 1) // 追加1个元素a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式a = append(a, []int{1,2,3}...) // 追加一个切片, 切片需要解包不过需要注意的是,在使用 append() 函数为切片动态添加元...原创 2019-11-05 12:39:18 · 408 阅读 · 0 评论 -
Go-16 切片详解
切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。Go语言 中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“...原创 2019-11-04 12:24:40 · 258 阅读 · 0 评论 -
Go-15 多维数组的使用
Go语言中允许使用多维数组,由于数组属于值类型,所以多维数组的所有维度都会在创建时自动初始化零值。多维数组尤其适合管理具有父子关系或者与坐标系相关联的数据。下面通过实例来演示一下如何声明一个二维数组。【示例 1】声明二维数组// 声明一个二维整型数组,两个维度的长度分别是 4 和 2var array [4][2]int// 使用数组字面量来声明并初始化一个二维整型数组arra...原创 2019-11-04 11:38:42 · 393 阅读 · 0 评论 -
Go-14 数组详解
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。和数组对应的类型是 Slice(切片),Slice 是可以增长和收缩的动态序列,功能也更灵活,但是想要理解 slice 工作原理的话需要先理解数组,所以下面将主要讲解数组的使用。Go语言数组的声明数组的声明语法如下:var 数组变量名 [元素数量...原创 2019-11-04 11:20:18 · 1915 阅读 · 0 评论 -
Go-13 strconv包:字符串和数值类型的相互转换
除了字符串、文字符号和字节之间的转换,我们常常也需要在数值和字符串之间相互转换,Go语言的 strconv 包提供了字符串与数值类型之间的相互转换功能。可以将数值类型转换为字符串,也可以将字符串转换为数值类型。strconv 包里提供了很多函数,大概分为以下几类:字符串转 int:Atoi(); int 转字符串:Itoa(); Parse 类函数将 string 转换为指定的数值类型:...原创 2019-11-04 10:57:11 · 960 阅读 · 0 评论 -
Go-12 运算符的优先级
运算符是用来在程序运行时执行数学或逻辑运算的,在Go语言中,一个表达式可以包含多个运算符,当表达式中存在多个运算符时,就会遇到优先级的问题,此时应该先处理哪个运算符呢?这个就由Go语言运算符的优先级来决定的。比如对于下面的表达式:var a, b, c int = 16, 4, 2d := a + b*c对于表达式a + b * c,如果按照数学规则推导,应该先计算乘法,再计算加法;...原创 2019-11-04 10:25:14 · 238 阅读 · 0 评论 -
Go-11 关键字与标识符
Go语言的代码中的几乎所有东西都有一个名称或标识符,另外,Go语言是区分大小写的,这与C语言家族中的其它语言相同。有效的标识符必须以字符(可以是任何 UTF-8 编码的字符或_,数字除外)开头,然后紧跟着 0 个或多个字符或 Unicode 数字,如:X56、group1、_x23、i、өԑ12。以下是无效的标识符:1ab(以数字开头) case(Go语言的关键字) a+b(不能包含运算...原创 2019-11-04 10:15:05 · 188 阅读 · 0 评论 -
Go-10 注释的定义及使用(godoc工具提取注释内容)
在学习 Go语言注释之前,大家可以先来看一下下面的这段代码://test.gopackage mainimport "fmt" // 引入 fmt 包func main() { fmt.Printf("Καλημέρα κόσμε; or こんにちは 世界\n")}上面这个例子通过打印“Καλημέρα κόσμε; or こんにちは 世界”展示了如何在Go语言中使用...原创 2019-11-04 10:09:32 · 1586 阅读 · 0 评论 -
Go-09 使用const和iota模拟枚举
Go语言现阶段没有枚举类型,但是可以使用 const 常量配合之前介绍的iota 来模拟枚举类型,请看下面的代码:type Weapon intconst ( Arrow Weapon = iota // 开始生成枚举值, 默认为0 Shuriken SniperRifle Rifle Blower)// 输出所有枚举值fmt...原创 2019-11-03 04:11:26 · 232 阅读 · 0 评论 -
Go-08 常量和const关键字
Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。常量的定义格式和变量的声明语法类似:const name [type] = value,例如:const pi = 3.14159 // 相当...原创 2019-11-01 00:40:42 · 316 阅读 · 0 评论 -
Go-07 变量的生命周期
变量的生命周期指的是在程序运行期间变量有效存在的时间间隔。对于在包级别(函数外部)声明的变量来说,它们的生命周期和整个程序的运行周期是一致的,而相比之下,局部变量的生命周期则是动态的,每次从创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能会被回收。函数的参数变量和返回值变量都是局部变量,它们在函数每次被调用的时候创建。例如,下面摘录的部分代码片段:for t ...原创 2019-11-01 00:11:35 · 150 阅读 · 0 评论 -
Go-06 指针详解
与 Java 和 .NET 等编程语言不同,Go语言为程序员提供了控制数据结构指针的能力,但是,并不能进行指针运算。Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这对于构建运行良好的系统是非常重要的。指针在Go语言中可以被拆分为两个核心概念:类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。 切...原创 2019-10-31 03:09:13 · 232 阅读 · 0 评论 -
Go-05 变量的作用域
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。Go语言中的变量分为三种类型,分别是局部变量、全局变量和形式参数。局部变量在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。package mainimport ( "fmt")func main() { //声明局部变量 a 和 b 并赋值 ...原创 2019-10-31 00:38:04 · 163 阅读 · 0 评论 -
Go-04 匿名变量(没有名字的变量)
在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。匿名变量的特点是一个下画线“_”,“_”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它...原创 2019-10-31 00:35:57 · 300 阅读 · 0 评论 -
Go-03 多个变量同时赋值
编程最简单的算法之一,莫过于变量交换。交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下:var a int = 100var b int = 200var t intt = aa = bb = tfmt.Println(a, b)在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间...原创 2019-10-31 00:31:02 · 788 阅读 · 0 评论 -
Go-02 变量的初始化
Go语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如:整型和浮点型变量的默认值为 0 和 0.0。 字符串变量的默认值为空字符串。 布尔型变量默认为 bool。 切片、函数、指针变量的默认为 nil。当然,依然可以在变量声明时赋予变量一个初始值。变量初始化的标准格式var 变量名 类型 = 表达式例如,游戏中,玩家的血量初始值...原创 2019-10-30 23:26:21 · 97 阅读 · 0 评论 -
Go-01 变量的声明
声明变量-标准格式Go 语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。声明变量的一般形式是使用 var 关键字:var name type其中,var 是声明变量的关键字,name 是变量名,type 是变量的类型。...原创 2019-10-30 23:02:48 · 124 阅读 · 0 评论