Go语言入门指南:基础语法和常用特性解析(一)| 青训营

92 阅读4分钟

1. Go语言介绍

Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,他们最终的目标是设计一种适应网络和多核时代的C语言。所以Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”,当然从各种角度看,Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想。但是Go语言更是对C语言最彻底的一次扬弃,它舍弃了C语言中灵活但是危险的指针运算,还重新设计了C语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。

2. 基本语法

和C语言相似,go语言的基本组成有:

  • 包声明:编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main

  • 引入包:其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。

  • 函数:和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。

  • 变量:Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

  • 语句/表达式:在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号;结尾,因为这些工作都将由 Go 编译器自动完成。

  • 注释:和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

    注意:

    1. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);
    2. 标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected)

3. 数据类型

3.1定义变量

声明变量的一般形式是用var关键字,具体格式为:var identifier typename如下的代码中我们定义了一个类型为int的变量。

package main
import "fmt"
func main() {
    var a int = 27
    fmt.Println(a);
} 

若定义变量时,没有进行初始化,则默认数值类型为0,布尔类型为false,字符串类型为空字符串""

3.1.1 定义变量未指定变量类型

在go语言中如果没有指定变量类型,可以通过变量的初始值来判断变量类型。如下代码

package main
import "fmt"
func main() {
    var d = true
    fmt.Println(d)
}

3.1.2 := 符号

当我们定义一个变量后又使用该符号初始化变量,就会产生编译错误,因为该符号其实是一个声明语句。

使用格式:typename:=value

也就是说intval:=1相当于:

var intVal int 
intVal =1 

3.2 基本类型

类型描述
uint8 uint16 uint32 uint64无符号8/16/32/64位整型
int8 int16 int32 int64有符号8/16/32/64位整型
float32 float64IEEE-75432/64位浮点型数
complex64 complex12832/64位实数和虚数
byte类似uint8
rune类似int32
uintptr无符号整型,用于存放一个指针

3.3 指针

和基础类型数据相同,在使用指针变量之前我们首先需要申明指针,声明格式如下:var var_name *var-type,其中的var-type为指针类型,var_name为指针变量名, *号用于指定变量是作为一个指针。

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */

指针的初始化就是取出相对应的变量地址对指针进行赋值,具体如下:

   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */
​
   ip = &a  /* 指针变量的存储地址 */

3.4 数组

3.4.1 声明数组

G0语言数组声明需要指定元素类型及元素个数,语法格式如下:

var variable_name [SIZE] variable_type

以上就可以定一个一维数组,我们举例代码如下:

var balance [10] float32

3.4.2 初始化数组

  1. 直接进行初始化:var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  1. 通过字面量在声明数组的同时快速初始化数组:balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  1. 数组长度不确定,编译器通过元素个数自行推断数组长度,在[]中填入...,举例如下:var balance = [...]float32{1000.0, 2.0, 3.4, 7.9, 50.0} 和 balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  1. 数组长度确定,指定下标进行部分初始化:balance := [5]float32(1:2.0, 3:7.0)