由于之前看过其他脚本语言,此时看服务器端语言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. 1 // The most basic type, with a single condition.
  2. 2 i := 1
  3. 3 for i <= 3 {
  4. 4 fmt.Println(i)
  5. 5 i = i + 1
  6. 6 }
  7. 7
  8. 8 // A classic initial/condition/after `for` loop.
  9. 9 for j := 7; j <= 9; j++ {
  10. 10 fmt.Println(j)
  11. 11 }
  12. 12
  13. 13 // `for` without a condition will loop repeatedly
  14. 14 // until you `break` out of the loop or `return` from
  15. 15 // the enclosing function.
  16. 16 for {
  17. 17 fmt.Println("loop")
  18. 18 break
  19. 19 }
  20. 20
  21. 21 // You can also `continue` to the next iteration of
  22. 22 // the loop.
  23. 23 for n := 0; n <= 5; n++ {
  24. 24 if n%2 == 0 {
  25. 25 continue
  26. 26 }
  27. 27 fmt.Println(n)
  28. 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()函数来创建切片:

  1. var slice1 []type = make([]type, len)
  2. //也可以简写为
  3. slice1 := make([]type, len)
  4.  
  5. //也可以指定容量,其中capacity为可选参数。
  6. make([]T, length, capacity)

16、范围

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

  1. nums := []int{, , }
  2. sum :=
  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 == {
  7. result = ;
  8. } else {
  9. result = x * Factorial(x - );
  10. }
  11. return;
  12. }
  13.  
  14. func main() {
  15. var i int =
  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 语言通过内置的错误接口提供了非常简单的错误处理机制。错误接口理解可以参考上一小节接口来进行理解。使用方法:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. // 定义一个 DivideError 结构
  8. type DivideError struct {
  9. dividee int
  10. divider int
  11. }
  12.  
  13. // 实现 `error` 接口
  14. func (de *DivideError) Error() string {
  15. strFormat := `
  16. Cannot proceed, the divider is zero.
  17. dividee: %d
  18. divider:
  19. `
  20. return fmt.Sprintf(strFormat, de.dividee)
  21. }
  22.  
  23. // 定义 `int` 类型除法运算的函数
  24. func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
  25. if varDivider == {
  26. dData := DivideError{ //dData类型根据右侧类型自动判断为error接口
  27. dividee: varDividee,
  28. divider: varDivider,
  29. }
  30. errorMsg = dData.Error()//返回DivideError重写后的Error方法返回值
  31. return
  32. } else {
  33. return varDividee / varDivider, ""
  34. }
  35.  
  36. }
  37.  
  38. func main() {
  39.  
  40. // 正常情况
  41. if result, errorMsg := Divide(, ); errorMsg == "" {
  42. fmt.Println("100/10 = ", result)
  43. }
  44. // 当被除数为零的时候会返回错误信息
  45. if _, errorMsg := Divide(, ); errorMsg != "" {
  46. fmt.Println("errorMsg is: ", errorMsg)
  47. }
  48.  
  49. }

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

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

服务器端语言go之开篇分享的更多相关文章

  1. Language Guide (proto3) | proto3 语言指南(开篇)

    前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者 ...

  2. Go语言并发编程示例 分享(含有源代码)

    GO语言并发示例分享: ppt http://files.cnblogs.com/files/yuhan-TB/GO%E8%AF%AD%E8%A8%80.pptx 代码, 实际就是<<Go ...

  3. C语言dos程序源代码分享(进制转换器)

    今天给大家分享一个dos程序的源代码 这个程序是本人在学习中的经验分享 如果有问题或者建议,欢迎大家一起交流 源代码: /*本程序为一个进制转换器 本程序不作为商业用途,完全为技术交流 喜欢C语言的同 ...

  4. 服务器端架构及实战 — C#分享

    简介 此文是我2008年读研究生期间做的C#项目技术分享,给计算机专业学生的一些经验分享. 当时工作2年后读研. 计算机基础了解及介绍 了解计算机的核心课程和大家的理解 二进制的历史和原理 数字逻辑及 ...

  5. C/C++编程笔记:流行的数字游戏【2048】,C语言400行源代码分享

    游戏介绍 你玩过2048吗?2048是一款流行于各大网页和手机的数字游戏,手机安卓版推出的是<挑战2048>,之后的版本中还加入了双人对战的游戏模式,更加受到玩家的热捧. 2048的游戏规 ...

  6. C语言课设心得分享(一)

    今儿上完课设,老师果然讲的比较少,周四还不用去,看来还是学生自己折腾.我在做课设的过程中,攒了一些心得/体会,希望能和大家分享分享,也希望能一起探讨探讨.如果是我能回答的问题,我很乐意能够提供帮助. ...

  7. 【Android 多语言切换简单实例分享】

    一.Android多语言切换 Android应用的开发不可能仅仅针对某一个国家或者区域使用,各国间语言文化各不同样,因此一个优秀的APP必须支持多种语言,为了实现这个特性,Android给出了一个解决 ...

  8. R语言学习网站(分享)

    1. https://www.r-bloggers.com/ 2. https://www.kaggle.com/datasets 3. RStudio download: https://www.r ...

  9. [知识库分享系列] 四、ASP.NET MVC and Winform

    知识库分享系列: [知识库分享系列] 三.Web(高性能Web站点建设) [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍本篇分享两个知识库节点,分别为“AS ...

随机推荐

  1. Java父线程(或是主线程)等待所有子线程退出

    static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final Object wait ...

  2. TFboy养成记

    转自:http://www.cnblogs.com/likethanlove/p/6547405.html 在tensorflow的使用中,经常会使用tf.reduce_mean,tf.reduce_ ...

  3. Less的Extend_Less继承

    Extend就相当于Java的继承,它允许一个选择器继承另一个选择器的样式.Extend有两种语法格式. 一种是: <selector>:extend(<parentSelector ...

  4. 用C语言画一个心

    用C语言图形库画一个心 --环家伟 这次我教大家用代码画一个心,这样你们就可以送给你们的女(男)朋友了.没找到对象的也可以用来表白啊. 1.首先,我去百度找了心形线的函数,如下: 2.  联系高中的数 ...

  5. springboot之Jwt验证

    简介 什么是JWT(Json Web Token) jwt是为了在网络应用环境间传递声明而执行的一种基于json的开放标准.该token被设计紧凑且安全的,特别适用于SSO场景. jwt的声明一般被用 ...

  6. PHP求解一个值是否为质数

    /** * 求解一个值是否为质数 * * @param $a * @return int 0是 1不是 */ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function ...

  7. UWP 判断系统版本

    public class VersionsHelper { , ); , ); , ); , ); , ); }

  8. React学习笔记--程序调试

    React学习笔记 二 程序调试   前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...

  9. .net多线程应用

    昨天在部门分享.net多线程的一些内容,特此在博客记录下.内容如下: 进程与线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 ...

  10. Maven - Maven基础

    1-下载及安装 1.1 - Maven - 项目管理利器 http://maven.apache.org/ Apache组织的开源项目. Maven是一个基于POM(Project Object Mo ...