前言

  上一篇入门篇算是初识庐山真面目,我们知道了一个go程序的构成,在这里总结一下。

  1. //包名
  2. package
  3. //导入包
  4. import "fmt"
  5. //main方法,程序入口
  6. func main() {
  7. //程序主体
  8. fmt.Println("Hello World!")
  9. }

  那么,作为一个经验丰富的程序员,接下来很自然地就是看看它的语法是怎么样的,怎么声明变量、常量,有哪些数据类型,有哪些运算符,有哪些控制语句,有哪些数据结构,怎么使用函数,还有注释、转义等等。

  当然,作为OO,还会涉及如何定义接口、类,如何创建对象。但下面的内容只会对go语法作一个全览,不作深入探究。更多的细节或者我觉得比较有趣的内容留待后面的文章中探讨。比如go的变量声明为什么设计成名字在前类型在后,为什么go没有三元操作符等等。

行分隔

一行代表一个语句结束,不需要使用分号结尾。

同时go源码格式是语言规范的一部分,并提供了 gofmt工具格式化代码,因此团队协作时,不需要担心格式式模板的问题。

注释

  1. //单行注释
  2. /*
  3. * 块注释
  4. */

转义

go语言的转义符是\,其他没有什么特别的。

变量&常量

  1. //声明整型变量a
  2. var a int
  3. //声明整型变量a,并赋初值1
  4. var a = 1
  5. //声明整型变量a,并赋初值1
  6. a := 1
  7. //多变量声明
  8. var a, b int
  9. var a, b = 123, 456 //同类型
  10. c, d := 111, "abc" //不同类型
  11. var (
  12. a int
  13. b string
  14. )
  15. //声明常量
  16. const a int = 1
  17. const b = 1
  18. const (
  19. c string = "abc"
  20. d := 1
  21. )
  22. const (
  23. x = iota //0
  24. y //1, 自动加1
  25. z //2, 自动加1
  26. )

可以看出,变量的声明名称在前,类型在后。而对于不同的数据类型或结构,初值及初始化语法有所差别。此差别会在下文中可以看到。

数据类型

名称 说明
布尔类型 bool,值true or false
数字类型 包括整型(int,uint,uintptr,byte,rune,uint8,uint16,uint32,uint64,int8,int16,int32,int64)、浮点型(float32,float64,complex64,complex128)
字符类型 即字符串类型,采用UTF-8编码
派生类型 包括指针,数组,切片,map,结构,通道,函数,接口

其中数字类型区分了有符号类型、无符号类型,同时还细分了位数。go号称性能高,如果没有这些细分的数据类型,恐怕就不好吹牛B了。

运算符

名称 说明
算术运算符 +, -, *, /, %, ++, --
关系运算符 ==, !=, >, <, >=, <=
逻辑运算符 &&, ||, !
位运算符 &, |, ^(异或), >>, <<
赋值运算符 =, +=, -=, *=, /=, %=, <<=, >>=, &=,
其他运算符 &(取地址), *(指针)

运算符倒没什么特别的,该有的都有,除了三元操作符

控制语句

  1. //if语句
  2. a := 1
  3. if a == 1 {//if条件是不带括号的,除了复合条件
  4. fmt.Println("a==1")
  5. } else if a < 1 {
  6. fmt.Println("a<1")
  7. } else {
  8. fmt.Println("a>1")
  9. }
  10. //switch语句
  11. b := "abc"
  12. switch b {
  13. case "abc":
  14. fmt.Println("abc")
  15. case "xyz":
  16. fmt.Println("xyz")
  17. case "hello", "world":
  18. fmt.Println("Hello World")
  19. default:
  20. fmt.Println("unknown")
  21. }
  22. //type-switch,用于类型判断
  23. swithc b.(type) {
  24. case int:
  25. fmt.Println("int")
  26. case string:
  27. fmt.Println("string")
  28. default:
  29. fmt.Println("unknown")
  30. }
  31. //select语句,常用于channel通信
  32. var c1, c2 chan int
  33. select {
  34. case <- c1:
  35. fmt.Println("c1")
  36. case <- c2:
  37. fmt.Println("c2")
  38. default
  39. fmt.Println("none")
  40. }
  41. //如果没有 default,select语句会从可用的case中公平随机地选择一个,否则阻塞直至某个 case可用
  42. //case都不可用且有default时,选择default分支
  43. //for循环
  44. for i := 1; i < 10; i++ {
  45. fmt.Println(i)
  46. }
  47. i := 1
  48. for {
  49. if i >= 10 {
  50. break
  51. }
  52. fmt.Println(i)
  53. i++
  54. }
  55. array := [2]int{1,2}
  56. for index, value := range array {
  57. fmt.Printf("index: %d, value: %d", index, value)
  58. }

看起来多了select语句,但少了while语句。但其for语句的可用性显著地高于其他语言。

数据结构

  1. //声明指针
  2. var a *int
  3. //声明int数组
  4. var array [2]int
  5. array[0] = 1
  6. var array2 = [3]int{1,2,3}
  7. var array3 = [...]int{1,2}
  8. //数组访问
  9. b := array2[0] //第1个元素
  10. c := array2[1:2] //c = [2]int{2,3}
  11. d := array2[1:] //d = [2]int{2,3}
  12. e := array2[:2] //e = [2]int{1,2}
  13. //数组遍历
  14. for index, value := range array2 {
  15. }
  16. //_表示忽略返回值
  17. for _, value := range array2 {
  18. }
  19. //声明切片(相当于Java的List)
  20. var slice []int //相当于List<Integer>
  21. slice = make([]int, 2) //相当于new ArrayList<Integer>(2)
  22. var slice2 []int = make([]int, 2)
  23. slice3 := make([]int, 2)
  24. //切片的访问与数组一样
  25. //声明map
  26. var map1 map[string]string
  27. map1 = make(map[string]string, 2) //相当于new HashMap<String, String>(2)
  28. var map2 map[string]string = make(map[string]string, 2)
  29. map3 := make(map[string]string, 2)
  30. //map 赋值
  31. map3["a"] = "a"
  32. map3["b"] = "b"
  33. //map 访问
  34. ma := map3["a"] //ma = a
  35. //map 遍历
  36. for key, value := range map3 {
  37. }
  38. //判断元素是否存在
  39. if exists, value := map3["a"]; exists {
  40. }
  41. //声明 struct,可认为是go语言的类定义
  42. type House struct {
  43. Area float32
  44. Price int64
  45. }
  46. //struct 构建
  47. h := House{}
  48. h.Area = 120.0
  49. h.Price = 30000
  50. h1 := House{Area: 120.0, Price: 30000}

函数

  1. package main
  2. import "fmt"
  3. //函数声明
  4. func foo() string {
  5. return "bar"
  6. }
  7. //函数声明2
  8. func foo2(value string) (string, error) {
  9. return bar + value, nil
  10. }
  11. //函数调用
  12. func main() {
  13. fmt.Println(foo())
  14. if r, err := foo2("xyz"); err != nil {
  15. fmt.Println(r)
  16. }
  17. }

  到此为止,go的基础语法已经罗列完毕。这些都是绝大多数语言的共性,除了表达方式上有所不同之外,所有的这些元素都是一门编程语言不可或缺的。总的来说,名字在前,类型在后,语句无分号,判断无括号,其他无两样。

  如果说go有什么不一样的话,那确实有许多不一样之处,留待下回细说。

请关注公众号

不一样的go语言-一样的语法的更多相关文章

  1. C语言-01-基本语法

    一.学前需知 开发工具 windows平台:Visual C++6.0等 mac平台:Xcode6.0等 以下文章内容皆是以Xcode6.0为开发工具,clang编译器. Xcode的一些常用快捷键 ...

  2. 关于JS脚本语言的基础语法

    JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱 ...

  3. Xamarin XAML语言教程基础语法篇大学霸

    Xamarin XAML语言教程基础语法篇大学霸 前  言 Xamarin是一个跨平台开发框架.它可以用来开发iOS.Android.Windows Phone和Mac的应用程序.使用Xamarin框 ...

  4. Cocos2d-x 脚本语言Lua基本语法

    Cocos2d-x 脚本语言Lua基本语法 前面一篇博客对Lua这门小巧的语言进行了简单的介绍.本篇博客来给大家略微讲一下Lua的语法.不会长篇累牍得把Lua的全部语法都讲一遍,这里通过下面几点来讲L ...

  5. GO语言的基本语法之变量,常量,条件语句,循环语句

    GO语言的基本语法之变量,常量,条件语句,循环语句 作为慕课网得笔记自己看 定义变量: 使用var关键字 var a, b, C bool var s1, s2 string = "hell ...

  6. tn文本分析语言(二) 基本语法

    tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. 本文主要介绍tn的基本语法.高级内容可以参考其他篇章.使用这样的语法,是为了 ...

  7. (转)JavaScript二:JavaScript语言的基本语法要求

    摘自:http://blog.csdn.net/erlian1992 要学习好JavaScript,首先我们要懂JavaScript语言的一些基本语法要求: 一,区分大小写 JavaScript语言区 ...

  8. javaweb学习总结七(XML语言作用、语法)

    一:XML语言的概念以及作用 1:xml概念:extensible Markup language,可扩展行标记语言,因为html的语法比较混乱,不够严谨. 用html写的系统不好维护,所以w3c组织 ...

  9. C语言-01基础语法

    1)         总结常见文件的拓展名 .c 是C语言源文件,在编写代码的时候创建 .o 是目标文件,在编译成功的时候产生 .out 是可执行文件,在链接成功的时候产生 2)         总结 ...

  10. C#语言不常用语法笔记

    只看过3天C#语法书,了解个大概,与C++等不同之处,或者看开源遇到一些奇异用法,记录一下,脑子不够用的情况下,还是记笔记靠谱. ==================== 顺便吐槽下,这年头得会各种编 ...

随机推荐

  1. redis的底层数据机构

    集群架构 参考 https://blog.csdn.net/wcf373722432/article/details/78678504 https://www.cnblogs.com/George19 ...

  2. mysql 案例 ~查询导致的tmp临时文件问题

    一 简介:之前遇到一个tmp分区暴涨的问题,后来经过大神的指点,遂分析写下 二 分类: 1  select语句出现 using temporay tmp 下出现 #sql_631a_1.MYD #sq ...

  3. mongodb系列~ mongodb慢语句(3)

    简介: 关于mongodb慢日志是如何收集 一 mongodb慢日志的开启 1 直接设置参数,不重启服务:db.setProfilingLevel(1) 2 添加启动参数,重启服务:添加profile ...

  4. mysql 案例~ 主从复制转化为级联复制

    一 需求 mysql 主从复制切换成级联复制二 核心思想 1 开启级联复制 2 确定postion点场景 A->B A-C 三 切换步骤  1 先确定好B为级联复制库  2 B添加log_upd ...

  5. python - socketserver 模块应用

    server端: import socketserver import subprocess import json import struct class MyTCPHandler(socketse ...

  6. MySQL内连接、外连接、交叉连接

    外连接: 左连接:left join 或 left outer join 以左边的表为基准,如果左表有数据,而右表没有数据,左表的数据正常显示,右表数据显示为空. 创建user表,用于记录用户 use ...

  7. SpringBoot整合Druid(阿里巴巴)数据源

    (1).添加相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...

  8. 允许远程用户登录访问mysql的方法

    需要手动增加可以远程访问数据库的用户. 方法一.本地登入mysql,更改 "mysql" 数据库里的 "user" 表里的 "host" 项 ...

  9. 转载:(Mac)在bash和zsh配置环境变量path的几种方法

    参考文献 老习惯,列出本文参考或引用或转载的文档和博客,致以崇高的敬意,感兴趣的可以去看看 1.http://postgresapp.com/ 2.http://postgresapp.com/doc ...

  10. springboot系列一、springboot产生背景及介绍

    一.为什么用Springboot 长期以来 Java 的开发一直让人所诟病: ·Java 项目开发复杂度极其高: · Java 项目的维护非常困难: · 在云时代如何实现项目的快速部署以及快速启动: ...