5.6.1.1. 函数调用作为函数参数 如果一个函数或方法接受一个或多个参数,我们当然可以传入相应的参数来调用它。此外,我们也可以传入另一个函数或方法来调用该函数,但前提是另一个函数的返回值和类型与要调用的函数参数一致。 下面的函数接受三角形三个边的长度作为参数(三个int类型),并使用Heron公…
Go语言开发-过程式编程-自定义函数-函数参数
5.6.1. 函数参数 我们已经演示了许多Go语言自定义函数的例子,这些函数都接受指定类型的固定数量的参数。我们可以通过使用interface{}类型来创建接受任意类型参数的函数。通过使用interface{},不管是自定义接口还是Go语言标准库中的,我们可以创建具有一组特定方法的接受任意类型参数的…
Go语言开发-过程式编程-自定义函数
5.6. 自定义函数 函数是过程式编程的基石,Go语言为它们提供了一流的支持。Go语言中的方法与函数非常相似,因此本节既适用于过程式编程,也适用于面向对象的编程。 下面是函数定义的基本语法:
1 2 3 4 5 6 | func functionName(optionalParameters) optionalReturnType { body } func functionName(optionalParameters) optionalReturnValues { body } |
一个函数可以接受零个或多个参数。如果没有参…
Go语言开发-过程式编程-Panic和Recover
5.5.1. Panic和Recover Go语言通过其内置的panic()和recover()函数提供异常处理机制。这两个函数提供了可以像其他语言(如C++、Java和Python)一样的通用异常处理机制,但是早Go语言中这样做不是一种好的编程风格。 Go区分错误和异常,错误是指可能出现错误但是程…
Go语言开发-过程式编程-Defer,Panic和Recover
5.5. Defer,Panic,和Recover defer语句用于将函数或方法(或匿名函数)延迟到函数结束或方法返回之前但要在返回值(如果有的话)计算之后执行。这也使得在defer语句块中修改函数的返回值成为可能(例如,使用运算符=赋值)。如果在一个函数或方法中使用了多个defer语句,则按照L…
Go语言开发-过程式编程-通信和并发语句-Select语句
5.4.1. Select语句 Go语言的select语句语法如下:
1 2 3 4 5 6 | select { case sendOrReceive1: block1 ... case sendOrReceiveN: blockN default: blockD } |
在select语句中Go语言会按顺序评估每一个发送和接收语句,如果任何语句可以继续进行(即没有被阻塞),则任意选择这些语句中一个来执行;如果没有可以继续执行的语句(…
Go语言开发-过程式编程-通信和并发语句
5.4. 通信和并发语句 Go语言的通信和并发功能将在第7章详细讲解,但是这里为了过程式编程的完整性,我们会简要介绍其基本语法。 goroutine是程序中与其它goroutine相互独立而又并发执行的函数或方法调用。每个Go程序至少有一个goroutine,主goroutine 在main包中的m…
Go语言开发-过程式编程-For循环语句
5.3. for循环语句 Go语言支持两种for循环语句,for和for…range语句。语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | for { // Infinite loop block } for booleanExpression { // While loop block } for optionalPreStatement; booleanExpression; optionalPostStatement { block } for index, char := range aString { // String per character iteration block } for index := range aString { // String per character iteration block // char, size := utf8.DecodeRuneInString(aString[index:]) } for index, item := range anArrayOrSlice { // Array or slice iteration block } for index := range anArrayOrSlice { // Array or slice iteration block // item := anArrayOrSlice[index] } for key, value := range aMap { // Map iteration block } for key := range aMap { // Map iteration block // value := aMap[key] } for item := range aChannel { // Channel iteration block } |
大括号是必需的,但是分号只有在可选的optionalPreStatement或optionalPostStatement语句存在时才…
Go语言开发-过程式编程-switch语句-类型开关
5.2.2.2. 类型开关 之前我们讲解过类型断言,当使用interface{}类型的变量时,我们常常需要访问其底层数据。如果我们知道其类型,我们就可以使用类型断言,但是如果其类型可能是多种类型中的一种,我们就可以使用类型开关语句。 Go语言的类型开关语法如下: [crayon-6780ad9c6f…
Go语言开发-过程式编程-switch语句-表达式开关
5.2.2.1. 表达式开关 Go语言的表达式开关语法如下:
1 2 3 4 5 6 | switch optionalStatement; optionalExpression { case expressionList1: block1 ... case expressionListN: blockN default: blockD } |
如果使用了可选声明,则分号是必需的,而不管其中是否使用了可选表达式。每个case块都由零个或多个语句组成。 如果switch语句中没有任何可选表达式,则编译器会假定表达式的…
Go语言开发-过程式编程-switch语句
5.2.2. switch语句 Go语言提供了两种类型的switch语句:表达式开关和类型开关。表达式开关与C、C++和Java语言中的类似,而类型开关是Go语言所特有的。这两种开关在语法上非常相似,但与C、C++和Java不同的是,Go语言的switch语句不会自动向下贯通(所以无需在每个case…
Go语言开发-过程式编程-IF语句
5.2.1. if语句 Go语言的if语句语法如下:
1 2 3 4 5 6 7 | if optionalStatement1; booleanExpression1 { block1 } else if optionalStatement2; booleanExpression2 { block2 } else { block3 } |
在一个if语句块中可能含有零个或多个elseif子句,以及零个或一个else子句,而每个子句中又由多个语句组成。 If中的大括号是必需的,但是分号只有在使用可选声明的情况下才需要。…
Go语言开发-过程式编程-分支
5.2.分支 Go语言支持3种分支:if、switch和select。我们也可以通过使用映射来实现分支功能,其中该映射的键用于选择分支,而值是对应的要调用的函数,稍后我们会详细介绍。 目录 作者:Johnson 原文:Go语言开发-过程式编程-分支 出处:青梅酒博客 – Plum Win…
Go语言开发-过程式编程-类型断言
5.1.2.类型断言 一个类型的方法集是指可以被该类型的值调用的所有方法的集合,对于没有方法的类型来数该集合为空。Go语言的interface{}类型用于表示空接口,即一个含有空集的方法集的类型的值。因为每个类型都有一个包含空集的方法集(不论其拥有多少方法),一个interface{}可以用于表示一…
HTTP 协议入门
HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。 本文介绍 HTTP 协议的历史演变和设计思路。 一、HTTP/0.9 HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式…