
GoLang
文章平均质量分 86
从流域到海域
此人不懒,但他除了干货什么都没有留下。
展开
-
Go使用类型断言处理动态JSON字段
Golang动态JSON类型断言原创 2023-03-18 17:55:12 · 1188 阅读 · 1 评论 -
Go go test测试机制介绍及实例【Go语言圣经笔记】
测试Maurice Wilkes,第一个存储程序计算机EDSAC的设计者,1949年他在实验室爬楼梯时有一个顿悟。在《计算机先驱回忆录》(Memoirs of a Computer Pioneer)这本书中,他回忆到:“忽然间有一种醍醐灌顶的感觉,我整个后半生的美好时光都将在寻找程序BUG中度过了”。肯定从那之后的大部分正常的码农都会同情Wilkes过分悲观的想法,虽然也许会有人困惑于他对软件开发的难度的粗浅看法。现在的程序已经远比Wilkes时代的更大也更复杂,也有许多技术可以让软件的复杂性可得到控制原创 2021-10-18 21:48:03 · 7349 阅读 · 0 评论 -
Go unsafe包底层编程细节详解 【Go语言圣经笔记】
底层编程Go语言的设计包含了诸多安全策略,限制了可能导致程序运行出错的用法。编译时类型检查可以发现大多数类型不匹配的操作,例如两个字符串做减法的错误。字符串、map、slice和chan等所有的内置类型,都有严格的类型转换规则。对于无法静态检测到的错误,例如数组访问越界或使用空指针,运行时动态检测可以保证程序在遇到问题的时候立即终止并打印相关的错误信息。自动内存管理(垃圾内存自动回收)可以消除大部分野指针和内存泄漏相关的问题。Go语言的实现刻意隐藏了很多底层细节。我们无法知道一个结构体真实的内存布局,原创 2021-10-15 21:20:12 · 806 阅读 · 0 评论 -
Go 反射机制详解及实例 【Go语言圣经笔记】
反射Go语言提供了一种机制,能够在运行时更新变量或检查它们的值、调用它们的方法和它们支持的内在操作,而不需要在编译时就知道这些变量的具体类型。这种机制被称为反射(这里反射的定义和其他语言大体相同)。反射也可以让我们将类型本身作为第一类的值类型处理。笔者补充:第一类值不一定是指面向对象程序设计中所指的对象,而是指程序中的所有实体(比如:变量、函数、队列、字典等等)。一般第一类值具有一下特征:可以被存入变量或其他结构可以被作为参数传递给其他方法/函数可以被作为方法/函数的返回值可以在执行期被创建原创 2021-10-13 20:30:14 · 1754 阅读 · 0 评论 -
Go 包概念及其机制详解&内置工具使用简介 【Go语言圣经笔记】
包和工具现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或模块的方式被重用。Go语言有超过100个的标准包(译注:可以用go list std | wc -l命令查看标准包的具体数目),标准库为大多数的程序提供了必要的基础构件。在Go的社区,有很多成熟的包被设计、共享、重用和改进,目前互联网上已经发布了非常多的Go语言开源包,它们可以通过 http://godoc.org 检索。在本章,我们将演原创 2021-10-07 12:02:24 · 934 阅读 · 0 评论 -
Go基于共享变量的并发原理及实例 【Go语言圣经笔记】
基于共享变量的并发前一章我们介绍了一些使用goroutine和channel这样直接而自然的方式来实现并发的方法。然而这样做我们实际上回避了在写并发代码时必须处理的一些重要而且细微的问题(笔者注:一谈到并发,就需要处理对共享变量等公共资源的访问问题,不合理的访问问题会造成一系列诸如丢失修改、读脏数据、重复读等常见并发问题)。在本章中,我们会细致地了解并发机制。尤其是在多goroutine之间的共享变量,并发问题的分析手段,以及解决这些问题的基本模式。最后我们会解释goroutine和操作系统线程之间的技原创 2021-10-04 17:08:44 · 1449 阅读 · 0 评论 -
Go select语句及其相关实例 【Go语言圣经笔记】
基于select的多路复用下面的程序会进行类似于火箭发射的倒计时的工作。time.Tick函数返回一个channel,程序会周期性地像一个节拍器一样向这个channel发送事件。每一个事件的值是一个时间戳,不过更有意思的是值的传送方式。// gopl.io/ch8/countdown1func main() { fmt.Println("Commencing countdown.") tick := time.Tick(1*time.Second) // channel fo原创 2021-09-27 22:19:23 · 481 阅读 · 1 评论 -
Go channel及其使用实例 【Go语言圣经笔记】
Channels如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信系统,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特定的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。使用内置的make函数,我们可以创建一个channel:ch := make(chan int) // ch has type 'chan原创 2021-09-27 22:13:32 · 5136 阅读 · 0 评论 -
Goroutine及其使用实例【Go语言圣经笔记】
Goroutines并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求。即使是传统的批处理问题——读取数据、计算、写输出,现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心。计算机的性能每年都在以非线性的速度增长。Go语言中的并发程序可以用两种手段来实现。本章讲解goroutine和channel,其支持“顺序通信进程”(communicating原创 2021-09-21 16:00:21 · 1405 阅读 · 0 评论 -
Go 接口及其相关机制深入解读加源码剖析 【Go语言圣经笔记】
接口接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力。很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必需的方法就足够了。这种设计可以让你创建一个新的接口类型满足已经存在的具体类型却不会去改变这些类型的定义;当我们使用的类型来自于不受我们控制的包时这种设计尤其有用。接口是一种约定目前为原创 2021-09-19 16:22:25 · 617 阅读 · 0 评论 -
Go error接口源码和errors包源码
Go语言中经常使用的error类型本质上一个接口,该接口只有一个方法Error(),该方法用于约束实现该接口的类型必须具有合适的将错误信息以string类型返回的同名Error()方法。它的源码非常简短,只有三行:type error interface { Error() string}下面我们来看一个例子,errors包,这个包的源码也非常简单,只有4行:package errorsfunc New(text string) error { return &errorStrin原创 2021-09-18 19:35:03 · 219 阅读 · 0 评论 -
Go方法及其相关特性 【Go语言圣经笔记】
方法和函数的区别在于有没有指定接收器。方法从90年代早期开始,面向对象编程(OOP)就成为了称霸工程界和教育界的编程范式,所以之后几乎所有大规模被应用的语言都包含了对OOP的支持,go语言也不例外。尽管没有被大众所接受的明确的OOP的定义,从我们的理解来讲,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些方法,而一个方法则是一个和特殊类型关联的函数。一个面向对象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是借助方法来做这些事情。(笔者.原创 2021-09-11 22:56:58 · 285 阅读 · 0 评论 -
Go 错误处理的五种机制 【Go语言圣经笔记】
错误处理策略错误传播重试输出错误并结束程序输出错误信息直接忽略当一次函数调用返回错误时,调用者应该选择合适的方式处理错误。根据情况的不同,有很多处理方式,让我们来看看常用的五种方式。首先,也是最常用的方式是传播错误。这意味着函数中某个子程序的失败,会变成该函数的失败。下面,我们以5.3节的findLinks函数作为例子。如果findLinks对http.Get的调用失败,findLinks会直接将这个HTTP错误返回给调用者:resp, err := http.Get(url)if e原创 2021-09-09 21:29:02 · 488 阅读 · 0 评论 -
Go函数及与函数相关机制 【Go语言圣经笔记】
函数函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用。函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间、不同地方独立完成。一个函数同时对用户隐藏了其实现细节(黑盒特性)。由于这些因素,对于任何编程语言来说,函数都是一个至关重要的部分。我们已经见过许多函数了。现在,让我们多花一点时间来彻底地讨论函数特性。本章的运行示例是一个网络爬虫,也就是web搜索引擎中负责抓取网页部分的组件,它们根据抓取网页中的链接继续抓取链接指向的页面。一个网络爬虫原创 2021-09-09 21:25:09 · 1412 阅读 · 1 评论 -
Go text模版和HTML模版【Go语言圣经笔记】
text模版和HTML模版前面的例子,只是最简单的格式化,使用Printf是完全足够的。但是有时候会需要复杂的打印格式,这时候一般需要将格式化代码分离出来以便更安全地修改。这些功能是由text/template和html/template等模板包提供的,它们提供了一个将变量值填充到一个文本或HTML格式的模板的机制。一个模板是一个字符串或一个文件,里面包含了一个或多个由双花括号包含的{{action}}对象。大部分的字符串只是按字面值打印,但是对于actions部分将触发其它的行为。每个actions都原创 2021-08-26 10:02:16 · 675 阅读 · 0 评论 -
Go语言中的JSON处理 【Go语言圣经笔记】
JSONJavaScript对象简谱(JSON, Java Script Object Notation)是一种用于发送和接收结构化信息的标准协议。在类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、可读性和流行程度等原因,JSON是应用最广泛的一个。Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中的encoding/json、encoding/xml、enco原创 2021-08-24 21:44:19 · 1068 阅读 · 0 评论 -
Go 结构体【Go语言圣经笔记】
结构体结构体是一种聚合的数据类型,它是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。使用结构体的经典案例是处理公司的员工信息,每个员工信息包含一个唯一的员工编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。所有的这些信息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或者是被存储到数组中,等等。下面两个语句声明了一个叫Employee的命名结构体类型(结构体定义同C语言),并且声明了一个Employee类型的变量dilbert:type原创 2021-08-17 22:16:05 · 342 阅读 · 0 评论 -
Go Map 【Go语言圣经笔记】
Map哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过key是否相原创 2021-07-28 22:28:54 · 549 阅读 · 0 评论 -
Go Slice【Go语言圣经笔记】
SliceSlice(切片)代表长的序列,序列中每个元素都有相同的类型(这一点同数组,事实上切片底层实现就是数组,一个切片必须依赖一个数组存在,多个切片可以依赖同一个数组,它们可以是该数组不同或相同的子序列)。一个Slice类型的元素一般写作[]T,其中T代表slice中元素的类型。slice的语法和数组很像,只是没有固定长度而已。数组和slice之间有着紧密的联系。一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。一个slic原创 2021-07-27 22:21:50 · 232 阅读 · 0 评论 -
Go 数组 【Go语言圣经笔记】
数组数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是固定的,因此在Go语言中很少直接使用数组。Go语言中有一种和和数组强相关的类型是Slice(切片),它是可以增长和收缩的动态序列,功能也更灵活,但是要理解slice工作原理的话需要先理解数组。数组的每个元素可以通过索引下标来访问(这被称作随机存取),索引下标的范围是从0开始到数组长度减1的位置。内置的len函数将返回数组中元素的个数。var a [3]intfmt.Println(a[0])fmt.Pr原创 2021-07-20 21:36:43 · 246 阅读 · 1 评论 -
Go常量 【Go语言圣经笔记】
常量常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string或数值型。一个常量的声明语句定义了常量的名字,和变量的声明语法类似,常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。例如,常量比变量更适合用于表达像π之类的数学常数,因为它们的值不会发生变化:const pi = 3.14159 // approximately; Math.Pi is a better approximation和变量声明一样,可以批量声明多个常量;这样比较适合声原创 2021-07-06 22:20:50 · 202 阅读 · 1 评论 -
Go字符串 【Go语言圣经笔记】
字符串一个字符串是一个不可改变的字节序列(笔者注:修改一个字符串会产生新的字符串)。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列,我们稍后会详细讨论这个问题。内置的len函数可以返回一个字符串总的byte数(而不是rune字符个数)(笔者注:如果想要取字符个数,需使用len([]rune(str)),这里面的差别在于byte对应uint8,而rune对应int32),索引操作s[i]返回第i个字节原创 2021-07-04 21:19:52 · 395 阅读 · 3 评论 -
整型及相关运算符 【Go语言圣经笔记】
整型及相关运算符Go语言的数值类型包括几种不同大小的整数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。让我们先从整数类型开始介绍。Go语言同时提供了有符号和无符号类型的整数运算。Go中有int8、int16、int32、int64四种截然不同大小的有符号整数类型,同时对应uint8、unit16、uint32、uint64四种无符号整数类型。Unicode字符rune类型是和int32等价的类型,通常表示一个Unicode的码点,这两个类型可以互换使用。byte类型也是uint原创 2021-06-06 22:01:34 · 2225 阅读 · 0 评论 -
作用域 【Go语言圣经笔记】
作用域一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变量。声明语句的作用域是指源代码中可以有效使用这个名字的范围。不要将作用域和生命周期混为一谈:声明语句的作用域对应的是一个源代码的文本区域,它是一个编译时的属性;一个变量的生命周期是指程序运行时变量存在的有效时间段,在该时间段内它可以被程序的其他部分引用,是一个运行时的概念。句法块是由花括弧所包含的一系列语句,就像函数体或循环体花括弧包裹的内容一样。句法块内部声明的名字是无法被外部块访问的。这个块决定了内部声明的名字的作用域范围原创 2021-04-29 22:19:35 · 236 阅读 · 0 评论 -
Go语言变量的生命周期 【Go语言圣经笔记】
摘自:Go语言圣经(简体中文版)变量的生命周期变量的生命周期指的是在程序运行期间有效存在的时间段。对于在包这一级别声明的变量来说,它们的生命周期和整个程序的运行周期是一致的(笔者注:某种程度上讲是静态的)。相比之下,局部变量的生命周期则是动态的:每次从创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能被回收。函数的参数变量和返回值都是局部变量,它们在函数每次被调用的时候创建。下面是一段示例程序:for t := 0.0; t < cycles*2*math.原创 2021-04-22 21:30:22 · 386 阅读 · 0 评论 -
Go语言指针 【Go语言圣经笔记】
摘自:Go语言圣经(简体中文版) 2.3.2指针一个变量对应一个保存了变量对应类型值的内存空间。普通变量在声明语句创建时被绑定到一个变量名,比如叫x的变量,但是还有很多变量始终以表达式方式引入,例如x[i]或者x.f变量。所有这些表达式一般都是读取一个变量的值,除非它们是出现在赋值语句的左边,这种时候是给对应变量赋予一个新的值。一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我们可以直接读或更.原创 2021-04-22 20:36:39 · 294 阅读 · 0 评论 -
Go语言起源 【Go语言圣经笔记】
Go语言起源以下早期语言对Go语言的设计产生了重要影响:CGo语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”。Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。PascalModula-2 包的概念Oberon 摒弃了模块接口文件和 模块实现文件之间的区别 面向对象特性所提供的方法的声明语法Oberon-2 包的导入和声明语法CSP - T原创 2021-03-31 12:29:47 · 294 阅读 · 0 评论 -
Go语言输入输出
输入和输出是编程语言使用比较基础,但容易被忽视的地方。因为实际开发的都是不会使用命令行,但这方面仍然是需要我们掌握的知识点。Go语言中函数就是指类似C语言的函数,而方法指的是实现了接口的函数,两个在概念上是不一样的。首先Go语言fmt包中提供了Scanf和Printf像C语言那样处理输入和输出,使用的格式控制字符中常见的和C语言一致,一部分则不一致。类C语言输入输出Go转义字符格式控制字符,又称转义字符,它对应一个变量名,以指定的格式将变量连接到输出的字符串中,它在字符串中相当于占位符,所.原创 2021-01-25 15:49:36 · 1778 阅读 · 0 评论 -
Go语言并发机制
Go语言并发机制是Go语言得以在后端开发中大显身手的核心机制。Go语言的并发机制在相当大的程度上比Java简单,比Python略微强大。这篇博文是简介,后面还会接着出详解。Go语言并发底层理论基础基于图灵奖得主C.A.R Hoare的主要贡献之一CSP(通信顺序过程)。大部分介绍Go语言并发机制的文章都以简述草草了事,因为这部分比较困难,它在我们学校里面是面向学硕的一门课程,而对工程师而言只要会用就可以了。之后我可能出相关文章。Go语言并发机制并发是编程语言中一个重要的概念,当前主要的编程语言.原创 2021-01-19 19:30:57 · 490 阅读 · 0 评论 -
Go语言反射
广义上来讲,反射是指计算机程序在运行时(run time)可以访问、检测和修改它本身状态或行为的一种能力。也即是说,反射就是程序在运行的时候能够"观察"并且修改自己的行为。Go语言不是严格的面向对象的语言,虽然它也能够通过接口、结构体、实现接口的方法三者在某种程度上实现面向对象的一些特性,但Go语言的反射机制不像Java的反射机制那样。Java反射机制实现的功能是:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。...原创 2021-01-10 16:42:44 · 331 阅读 · 0 评论 -
Go语言错误处理
Go语言中内置了错误接口提供简单方便的错误处理机制。请注意,异常(Exception)和错误(Error)在概念上来讲是不一样的。Go语言在语法层面区分了错误和异常,并提供了针对错误的处理机制。其他语言只有异常处理机制,没有错误处理机制。这篇博文介绍的是错误,下篇博文我们将介绍异常。错误指的是可能出现问题的地方出现了问题,比如打开一个文件时可能失败,这种情况在人们的意料之中。异常指的是不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在人们的意料之外。错误是业务逻辑的一部分,而异常不是 。.原创 2020-12-22 22:41:49 · 413 阅读 · 0 评论 -
Go语言接口(interface)
Go语言中的接口不是Java面向对象的那个接口,而是一种数据类型。但Go的接口多多少少继承了面向对象的那个接口的概念。笔者认为接口、结构体以及实现接口的方法三者组合起来,就能够实现面向对象。Go语言定义了新的数据类型接口(Interface)。Go语言的接口会将所有具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了该接口。Go语言中的接口类型有如下特性:包含0个或者多个方法的签名只定义方法的签名,不包含实现实现接口不需要显式的声明,需要实现接口中的所有方法接口定义使用in.原创 2020-12-21 17:47:46 · 293 阅读 · 1 评论 -
Go Map(集合)和sync.Map
Go中的Map对应的数据结构即为哈希表,但它的中文翻译却是集合,这点需要注意。我个人觉得翻译成集合错的很离谱,应该直译成映射。Go语言中的Map是一种无序的键值对集合。Map可以通过key在O(1)的时间复杂度内进行查询、更改、删除操作,key到value间的映射由哈希函数实现。Go的Map相当于C++的Map,Java的HashMap,Python的Dict。使用方式类Python的Dict,可以直接map[key]的形式访问元素,直接使用map[key] = vaule赋值形式添加新的元素或对已.原创 2020-12-21 17:08:20 · 611 阅读 · 1 评论 -
Go语言切片(Slice)
Python里面切片是一种操作,用于取list里面元素。而Go语言的切片则是一种数据类型,而不是一种操作。Go语言中提供了切片(Slice)作为一种更为灵活、功能强悍的内置类型,它其实是数组的一种抽象。切片的源码:type slice struct { array unsafe.Pointer len int cap int}Slice是原数组在内存中的地址的一个引用,它本身也是一个结构体。Go语言的数组同其他语言一样,一经定义,大小就不能改变。这在很多情况下很不方便。因此Go语言内.原创 2020-12-20 17:45:36 · 400 阅读 · 0 评论 -
Go语言数组
数组是线性表的一种实现,是最基本的数据结构之一。它以连续的地址空间存储相同类型的元素,按索引访问数组元素。优点是可以实现随机存取O(1),缺点是删除和添加一个元素需要在操作位置后大量移动元素O(n)Go语言也提供了数组这一类型,它可以存储整形、浮点型、字符串或者其他自定义类型。在概念上,Go语言的数组同其他语言的数组没有声明区别。声明数组语法如下:var array_name [SIZE]variable_type实例:var nums [10]int同其他语言,数组声明的同时,可以使用.原创 2020-12-20 10:55:46 · 758 阅读 · 1 评论 -
Go语言结构体
Go语言提供了和C语言概念一致的结构体。数组存的元素都是同一种数据类型,而结构体中可以存储不同类型的数据。结构体和指针是为什么称Go语言是类C语言的重要原因,因为两者在这两个概念上是完全一致的。结构体是由一系列相同类型或者不同类型的数据构成的数据集合。在概念上,结构体表示某一事物的属性集合。一首歌可以使用以下属性描述:titile: 夕焼けのスターマインsinger: 今井麻美duration: 4.35结构体使用关键字struct声明,其定义语法如下:type struct_vari.原创 2020-12-20 15:41:46 · 429 阅读 · 0 评论 -
Go语言指针
指针指向一个变量的内存地址。使用指针可以使很多操作变得简单,但同样提高了编程的难度和程序的可读性。C语言的指针是使得很多初学者头疼的一个重要点。指针其实并不难理解,我们本科时老师给我们讲过一句话,终身受用。他说:”指针就是地址,你看到指针就自动在大脑里给它替换成地址,就没有什么难理解的了。“比如,Go和C语言的指针,都有指针的指针这么一个概念,它其实就是地址的地址。一个变量它存了一个值,这个值是一个地址,逻辑上指向另一个地址,而这个地址存的值,还是一个地址。如图,p1是一个指针,它存在红色方框所代.原创 2020-12-20 11:52:33 · 180 阅读 · 1 评论 -
Go语言函数、方法及变量作用域
函数是编程语言的一个基本的代码块,逻辑上用于执行一些特定任务。函数是代码重用的最基本的例子,它把程序中一些频繁使用的操作抽取出来组成一个独立的代码快,通过函数调用来避免重复编写这部分代码。函数Go语言中没有类这个概念,因此函数就成了它最基本的组织单位。Go语言中函数的基本概念同其他编程语言。Go语言中最少需要有main()函数,这一点同C。Go语言标准库中提供了广泛的内置函数,这里介绍的主要是自定义函数。函数定义语法如下:func function_name([parameter list].原创 2020-12-19 11:40:54 · 628 阅读 · 1 评论 -
Go语言循环语句
程序包括三大结构:顺序结构、选择结构(条件语句控制)、循环结构(循环语句控制)。循环语句用于重复执行某些程序中的语句。编程语言中常见的循环语句包括while语句、do-while语句和for语句。但是Go语言中仅有for语言,没有while语句。从功能上讲,但凡while语句能做的事情,for语句也可以实现。因此Go语言统一了for语句和while语句详情见下。for语句Go语言的for语句一共有三种:第一种:for init; condition; post { ... }ini.原创 2020-12-19 10:39:46 · 831 阅读 · 1 评论 -
Go语言条件语句
条件语句是程序流程控制的一个重要部分。条件语句根据条件表达式的成立与否选择执行分支,从而实现对程序流程的控制。if语句、if-else语句、if-else-if以及嵌套的if语句和switch语句都是条件语句。Go语言的条件语句在概念和流程上与其他编程语言完全相同,因此这里不再赘述,写法上结合了Python和C++,即条件表达式不需要加括号,但仍然保留了花括号。具体例子见下:if系列if 语句语法:if 布尔表达式 { // 表达式值为true时执行语句体}实例:package ma.原创 2020-12-18 18:27:53 · 433 阅读 · 1 评论