1. Go基本组成元素

文件名

Go 的源文件以 .go为后缀存储在计算机中,这些文件名均由小写字母组成,如scanner.go;如果文件名由多个部分组成,则使用下划线_对它们进行分隔,如scanner_test.go;文件名不包含空格或其他特殊字符;

一个源文件可以包含任意多行的代码,Go本身没有对源文件的大小进行限制;

标识符

标识符是编程时所使用的名字,用于给变量、常量、函数、类型、接口、包名等进行命名,以建立名称和使用之间的关系,Go语言标识符的命名规则:

  • 只能由非空字母(Unicode)、数字、下划线(_)组成
  • 只能以字母或下划线开头
  • 不能是Go语言的关键字
  • 避免使用Go语言预定义标识符
  • 建议使用驼峰式
  • 标识符区分大小写

Go 语言提供一些预先定义的标识符用来表示内置的常量、类型、函数,在自定义标识符时应避免使用:

  • 内置常量:true、false、nil、iota
  • 内置类型:bool、byte、rune、int、int8、int16、int32、int64、uint、uint8、unit16、unit32、unit64、uintptr、float32、float64、complex64、complex128、string、error
  • 内置函数:make、len、cap、new、append、copy、close、delete、complex、real、imag、panic、recover
  • 空白标识符:_

关键字

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

字面量

字面量是值的表示方法,常用与对变量/常量进行初始化,主要分为:

  • 标识基础数据类型值的字面量,如:0,1.1, true, 3+4i, ‘a’
  • 构造自定义的复合数据类型的类型字面量,如:type interval int
  • 用于表示符合数据类型值的复合字面量,用在构造array、slice、map、struct的值,如:{1,2,3}

操作符

  • 算术运算符:+、-、*、/、%、++、—
  • 关系运算符: >、>=、<、<=、==、!=
  • 逻辑运算符: &&、||、!
  • 位运算符: &、|、
  • 赋值运算符: =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
  • 其他运算符: &(单目)、*(单目)、.(点)、-(单目)、…、<-

分割符

小括号(),中括号[],大括号{},分号;,逗号,

2. 声明

声明语句用于定义程序的各种实体对象,主要有:

  • 声明变量的 var
  • 声明常量的 const
  • 声明函数的 func
  • 声明类型的 type

3. 变量

变量是指对一块存储空间定义名称,通过名称对存储空间的内容进行访问或修改,使用var进行变量声明,常用的语法为:

  • var 变量名 变量类型 = 值
    定义变量并进行初始化,例如:var name string = “silence”
  • var 变量名 变量类型
    定义变量使用零值进行初始化,例如:var age int
  • var 变量名 = 值
    定义变量,变量类型通过值类型进行推导,例如:var isBoy = true
  • var 变量名1,变量名2,…,变量名n 变量类型
    定义多个相同类型的变量并使用零值进行初始化,例如:var prefix, suffix string
  • var 变量名1,变量名2,…,变量名n 变量类型 = 值1,值2,…, 值n
    定义多个相同类型的变量并使用对应的值进行初始化,例如:var prex, next int = 3, 4
  • var 变量名1,变量名2,…,变量名n = 值1,值2,…,值n
    定义多个变量并使用对应的值进行初始化,变量的类型使用值类型进行推导,类型可不相同,例如:var name,age = “silence”, 30
  • 批量定义
    var (
    变量名1 变量类型1 = 值1
    变量名2 变量类型2 = 值2
    )
    定义多个变量并进行初始化,批量复制中变量类型可省略
    例如:``` var (

    name string = “silence” age int = 30

)

  1. 当一个变量被声明之后,系统自动赋予它该类型的零值:int0float0.0boolfalsestring为空字符串,指针为nil。注意,所有的内存在Go中都是经过初始化的;
  2. 变量的命名规则
  3. 初始化表达式可以使用字面量、任何表达式、函数
  4. <a name="9d72a989"></a>
  5. ### 简短声明,使用:= 赋值操作符
  6. 在函数内可以通过简短声明语句声明并初始化变量,可通过简短声明同时声明和初始化多个变量,需要注意操作符左侧的变量至少有一个未定义过

package main

import “fmt”

func main() { n1, n2 := 1, 2 fmt,Println(n1, n2)

n2, n3 := 22, 3
fmt.Println(n2, n3)

}


注意:在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=, 但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值;

<a name="bf6bcf8f"></a>
### 赋值

可以通过赋值运算=更新变量的值,Go语言支持通过元组赋值同时更新多个变量的值,例如:n1, n2 = 1, 2,可用于两个变量的交换x, y = y, x

<a name="071d6907"></a>
## 4. 常量

常量用于定义不可被修改的值,需要在编译过程中进行计算,只能为基础的数据类型bool、数值、字符串,使用const进行常量申明,常用语法:

- const 常量名 类型 = 值<br />定义常量并进行初始化,例如:const pi float64 = 3.1415926
- const 常量名 = 值<br />定义常量,类型通过值类型进行推导,例如:const e = 2.7182818
- 批量定义<br />const (<br />常量名1 类型1 = 值1<br />常量名2 类型2 = 值2<br />)<br />定义多个常量并进行初始化,批量复制中变量类型可省略,并且除了第一个常量值外其他常量可同时省略类型和值,表示使用前一个常量的初始化表达式;<br />例如:

const (

name string = “silence” age int = 30

)

const (

name string = “silence” desc

)

<br />常量还可以用作枚举:

const (

a = iota // a = 0 b = iota // b = 1 c = iota // c = 2

)

<br />常量之间的运算,类型转换,以及对常量调用函数len、cap、real、imag、complex、unsafe.Sizeof得到的结果依然为常量;

<a name="819e4724"></a>
## 5. 作用域

作用域指变量可以使用的范围;go语言使用大括号显示的标识作用域范围,大括号内包含一连串的语句,叫做语句块;语句块可以嵌套,语句块内定义的变量不能在语句块外使用;

常见隐式语句块:

- 全语句块
- 包语句块
- 文件语句块
- if、switch、for、select、case 语句块

作用域内定义变量只能被声明一次且变量必须使用,否则编译错误,在不同作用域可定义相同的变量,此时局部将覆盖全局;

package main

import “fmt”

func main() { outer := 1 { inner := 2 fmt.Println(outer, inner) outer := 3 fmt.Println(outer, inner) } fmt.Println(outer) } ```

6. 注释

Go 支持两种注释方式,行注释和块注释:

行注释:以//开头;

块注释:以/开头,以/结尾;

7. 问题跟踪

最基本的问题跟踪方式为打印日志,我们可以fmt包中提供的Println、Print、Printf函数用于将信息打印到控制台,帮助我们进行问题调试;