服务器端语言go之开篇分享

  由于之前看过其他脚本语言,此时看服务器端语言go语法时也短短用了半天的时间,如图1所示,是个人学习go语法的目录截图,学习网址:菜鸟网站,为了个人方便学习和记忆,因此写下本篇文章,在本篇文章里我主要是针对目录中的项做以简单的理解并加以示例展示,可能不利于没有任何编程功底的同学学习,本人之前做过C++开发3年,这篇文章仅仅作为个人学习之用,记录的功能可能会比较零散,如果有想系统学习go语法的同学直接上菜鸟网站学习即可。

图1 go语法看点

1、语言教程

  Go 是一个开源的编程语言。Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

2、环境安装

  windows下下载msi文件,双击即可安装。安装包下载地址为:https://golang.org/dl/

3、结构

  包声明、引入包、函数、变量、语句 & 表达式、注释。执行go文件使用go run *.go

4、数据类型

  布尔、数字、字符串和派送类型(指针、数组、结构体、Channel、函数、切片、接口和Map)。关于派生类型后边会有详细介绍

5、变量

  var identifier type。例如:var a [type]= "w3cschool菜鸟教程"

6、常量

  const identifier [type] = value。例如:const b string = "abc"

7、运算符

  和C++一样

8、条件语句

  类似于C++,多一个select语句。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。switch case分支无break

9、循环语句

  类似于C++,多一个goto语句。goto语句将控制转移到被标记的语句。for融合了while功能

 1 // The most basic type, with a single condition.      
 2 i := 1                                                
 3 for i <= 3 {                                          
 4     fmt.Println(i)                                    
 5     i = i + 1                                         
 6 }                                                     
 7                                                       
 8 // A classic initial/condition/after `for` loop.      
 9 for j := 7; j <= 9; j++ {                             
10     fmt.Println(j)                                    
11 }                                                     
12                                                       
13 // `for` without a condition will loop repeatedly     
14 // until you `break` out of the loop or `return` from 
15 // the enclosing function.                            
16 for {                                                 
17     fmt.Println("loop")                               
18     break                                             
19 }                                                     
20                                                       
21 // You can also `continue` to the next iteration of   
22 // the loop.                                          
23 for n := 0; n <= 5; n++ {                             
24     if n%2 == 0 {                                     
25         continue                                      
26     }                                                 
27     fmt.Println(n)                                    
28 }                                                     

10、函数

  函数是基本的代码块,用于执行一个任务。Go 语言最少有个 main() 函数。函数支持多个返回值

1 func function_name( [parameter list] ) [return_types] {
2    函数体
3 }

11、变量作用域

  局部变量、全局变量和形式参数。形式参数为函数参数

12、数组

  和C++一样。例如:var variable_name [SIZE] variable_type,类型写在最后

13、指针

  Go 语言的取地址符是 &,一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。指针声明格式:var var_name *var-type,例如:var ip *int /* 指向整型*/,当一个指针被定义后没有分配到任何变量时,它的值为 nil。

14、结构体

  结构体定义需要使用 type 和 struct 语句,结构体的格式如下:

1 type struct_variable_type struct {
2    member definition;
3    member definition;
4    ...
5    member definition;
6 }

  一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:

1 variable_name := structure_variable_type {value1, value2...valuen}

15、切片

  切片是对数组的抽象。数组的长度不可改变,数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。一个未指定大小的数组来定义切片,例如:var identifier []type,切片不需要说明长度。使用make()函数来创建切片:

var slice1 []type = make([]type, len)
//也可以简写为
slice1 := make([]type, len)

//也可以指定容量,其中capacity为可选参数。
make([]T, length, capacity)

16、范围

  range 关键字用于for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。

1 nums := []int{2, 3, 4}
2 sum := 0
3 for _, num := range nums {
4     sum += num
5 }

17、Map

  map类似于C++ stl中的map,无序,可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

1 /* 声明变量,默认 map 是 nil */
2 var map_variable map[key_data_type]value_data_type
3 
4 /* 使用 make 函数 */
5 map_variable = make(map[key_data_type]value_data_type)

  如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对

1 var countryCapitalMap map[string]string
2 /* 创建集合 */
3 countryCapitalMap = make(map[string]string)

18、递归函数

  函数定义参考10小节函数定义,递归函数同C++中用法一样。以下实例通过 Go 语言的递归函数实例阶乘:

 1 package main
 2 
 3 import "fmt"
 4 
 5 func Factorial(x int) (result int) {
 6   if x == 0 {
 7     result = 1;    
 8   } else {
 9     result = x * Factorial(x - 1);
10   }
11   return;
12 }
13 
14 func main() {  
15     var i int = 15
16     fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(i))
17 }

19、类型转换

  类型转换用于将一种数据类型的变量转换为另外一种类型的变量。形如:type_name(expression)

20、接口

  Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

 1 /* 定义接口 */
 2 type interface_name interface {
 3    method_name1 [return_type]
 4    method_name2 [return_type]
 5    method_name3 [return_type]
 6    ...
 7    method_namen [return_type]
 8 }
 9 
10 /* 定义结构体 */
11 type struct_name struct {
12    /* variables */
13 }
14 
15 /* 实现接口方法 */
16 func (struct_name_variable struct_name) method_name1() [return_type] {
17    /* 方法实现 */
18 }
19 ...
20 func (struct_name_variable struct_name) method_namen() [return_type] {
21    /* 方法实现*/
22 }

  使用样例:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 type Phone interface {
 8     call()
 9 }
10 
11 type NokiaPhone struct {
12 }
13 
14 func (nokiaPhone NokiaPhone) call() {
15     fmt.Println("I am Nokia, I can call you!")
16 }
17 
18 type IPhone struct {
19 }
20 
21 func (iPhone IPhone) call() {
22     fmt.Println("I am iPhone, I can call you!")
23 }
24 
25 func main() {
26     var phone Phone
27 
28     phone = new(NokiaPhone)
29     phone.call()
30 
31     phone = new(IPhone)
32     phone.call()
33 }

21、错误处理

  Go 语言通过内置的错误接口提供了非常简单的错误处理机制。错误接口理解可以参考上一小节接口来进行理解。使用方法:

package main

import (
    "fmt"
)

// 定义一个 DivideError 结构
type DivideError struct {
    dividee int
    divider int
}

// 实现     `error` 接口
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
    return fmt.Sprintf(strFormat, de.dividee)
}

// 定义 `int` 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
        dData := DivideError{ //dData类型根据右侧类型自动判断为error接口
            dividee: varDividee,
            divider: varDivider,
        }
        errorMsg = dData.Error()//返回DivideError重写后的Error方法返回值
        return
    } else {
        return varDividee / varDivider, ""
    }

}

func main() {

    // 正常情况
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
        fmt.Println("100/10 = ", result)
    }
    // 当被除数为零的时候会返回错误信息
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
        fmt.Println("errorMsg is: ", errorMsg)
    }

}

  执行以上程序,输出结果为:

1 100/10 =  10
2 errorMsg is:  
3     Cannot proceed, the divider is zero.
4     dividee: 100
5     divider: 0

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“怎么以正确的方式替换Go语言程序自身”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希
本文小编为大家详细介绍“Go语言中除法运算的效率怎么提高”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中除法运算的效率怎么提高”文章能帮助大家解...
本文小编为大家详细介绍“Go语言中的next()方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中的next()方法怎么使用”文章能帮助大家解决疑...
这篇文章主要介绍了Go语言中slice的反转方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中slice的反转方法怎...
这篇文章主要介绍“怎么使用Go语言实现数据转发功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Go语
这篇文章主要讲解了“Go语言中怎么实现代码跳转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究
这篇文章主要讲解了“Go语言如何多开协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言如何多开协...