[go]初识go基础语法

144 阅读3分钟

Go playground

可以通过在线的playground(go.dev/play/)快速实验简…

示例程序

package main
import "fmt"
func main() {
     fmt.Println("Hello, Go!")
}

示例程序解读

每一个go程序都以package语句开始。一个go package表示功能相似的go代码集合,比如格式化字符串、绘制图像等。上述示例程序中package的名字为main

每个go package都允许定义一个或者多个的import语句。每个import语句会引入其他的package,方便我们使用其中定义的功能。

每个go package 会定义一个或者多个函数。

每个go程序在运行的时候,会寻找main函数作为执行的入口函数,如果忘记定义,运行时候会报错。

注意:go语句的末尾可以添加分号,但是不强制,通常,并不会添加分号。

注意:go自带源码格式化工具go fmt。通常惯例是,我们在编写完代码后,执行go fmt来格式化代码,以保证代码风格的一致。

go的基本规则

下面罗列go程序的基本规则,不遵守会导致编译器报错。

  1. 每个go程序必须以package语句开始。
  2. 每个go程序必须定义main函数。
  3. 函数调用必须显示指定所属package。
  4. 函数调用必须用括号将参数包围。

String

定义:用双引号包裹的字符序列。换行符、制表符、引号、反斜线和回车等需要转义。如:

"Hello World\n", "Hello\tWorld", "Hello World\"", "Hello World\\"

Rune

在go中,Rune表示单个字符。因为go采用Unicode标准来存储Rune(存储时,使用数字编码,而不是字符本身),因此,Rune可以表示任何语言中的任何字符。Rune的字面量采用单引号表示,如 'A'。如果用fmt.Println输出Rune时,得到的是数字编码,比如输出'A',将得到65。转义符号同样也可以表示为Rune,同样输出数字编码,比如fmt.Println('\t')输出9。

Boolean

go中布尔值只有2种取值:truefalse。布尔值多用于条件语句,控制代码块的执行。

Numbers

程序中直接使用数字常量即可,如:fmt.Println(23),输出23。

数学计算和大小比较

支持基本得加(+)、减(-)、乘(*)、除(/)。

大小比较支持:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(!=)、等于(==)。

类型

go是静态类型语言。如果传递类型错误,go编译器会报错。常见的类型包括:

  1. int : 整数
  2. float64 : 64bit的浮点数
  3. bool : 布尔值
  4. string : 字符串。

可以通过reflect package的TypeOf方法来获取值的类型,如:

fmt.Println(reflect.TypeOf(23))将输出 int。

定义变量

go程序中通过var关键字来声明变量,格式如下:

var variable_name type 如:

  1. var quantity int
  2. var length, width float64 # 同时定义多个同类型的变量
  3. var customerName string

声明变量后,我们可以给变量赋值。我们可以同时给多个变量赋值,如:

length, width = 1.2, 2.4

我们可以在声明变量的同时给变量赋值,如:

var quantity int = 4

var length, width float64 = 1.2, 2.4

如果我们声明变量的同时给变量赋值,我们可以去掉变量的类型来简化语句,如:

var quantity = 4

var length, width = 1.2, 2.4

上述语句可以进一步简化成(short variable declaration):

quantity := 4

length, width := 1.2, 2.4

默认值(Zero Value)

如果我们在声明变量的时候,不指定初始值,那么变量会获得类型的默认值:

  1. 数字类型的默认值是0
  2. 布尔类型的默认值是false
  3. string类型的默认值是空串

命名规则

适用于变量、函数及类型的命名:

  1. 名称必须以字母开头,后跟任意数量的字母或数字
  2. 如果名称以大写字母开头,则视为对package外可见(即其他package可以访问);如果首字母为小写字母,则只对package内可见。

以上规则为go语言的强制命名规则。同时,go社区也有一些命名上的惯例规则,如:

  1. 如果名称包含多个单词,采用驼峰式
  2. 如果名称含义在上下文中可以很容易推导,则命名采用简化方式,如:i而不是indexmax而不是maximum

类型转换

数学运算及大小比较操作中要求涉及的多个值必须是相同类型,否则编译器报错,如:下列程序将会报错类型不匹配

a := 1; b := 1.5; fmt.Print(a < b)

必须应用类型转换,将比较的2个值统一为相同的类型

a := 1; b := 1.5; fmt.Print(float64(a) < b) # 也可改为 a < int(b)

注意,go程序中,如果将int()应用于浮点数,小数部分会直接砍去,不会进行四舍五入。

编译程序

假设我们将开篇的示例程序存入hello.go文件,在命令行执行如下命令:

go fmt hello.go # 格式化源码

go build hello.go # 编译源码,生成可执行文件。mac Os/Linux上生成hello,windows上hello.exe

命令行常用的go命令:

  1. go build # 编译源码,并生成可执行文件
  2. go fmt # 格式化源码文件
  3. go run # 编译并执行程序,不生成可执行文件
  4. go version # 展示go版本

Content mainly excerpted from 『Head First Go』 by Jay McGavren