Golang基础语法与特性(一) | 青训营笔记

128 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第1天

> 第一节掘金课的主题为:Go 语言基础 - 基础语法

1.Go语言的来历

Golang是Google于2009年开发的一款开源编程语言,它是一款基于并发、垃圾回收机制、编译的高级语言。
在Go诞生之前,Google开发项目时C++为主、结合了Py、Java,工程项目的代码量之巨大、服务器的数量的庞多、且有着分布式编译的需求,导致程序难以维护、时常面临着运行失控难以调节的风险,多种语言的掺杂使得项目编译速度缓慢,加大了交叉编译的难度,这样的窘境迫使他们开发了一款好用且方便的语言,Golang就是在这种环境下诞生的。

2.Go语言的优点

Golang具有高性能、高并发的特点,其语法简单,对于Go语言的学习过程速度平缓,适合学习。它具有非常丰富的标准库、完善的工具链,具有静态链接、快速编译、跨平台的特点,其垃圾回收机制也采用了较为高效的并发三色标记和扫描收集器。

3.Go的安装

Golang的开发环境,可以从这三个链接的网站中进行下载、安装和配置:

Golang的集成开发环境,选择集成开发环境,可以从Visual Studio Code的插件或Jetbrains的Goland入手,当然如Goland,开发环境可以直接从软件配置运行时选择Go版本在Goland内进行下载。

4.Go的基础语法

(1). Go的Hello World
  • 根据Golang的特性,每个文件夹有一个包名,称为package name,可以与文件夹的名字不同,对于一个Golang程序有一个main包,用于运行程序和初始化。这一点与Java不同,Java文件系统要求包名与物理文件夹的名称相符。
  • 下一个位置是import,导入程序所需的包,这里是"fmt"包,包含标准 I/O。
  • Golang是严格区分大小写的,在书写时要注意这一点,书写的语句只有一行,不需要添加分号,若行内有多个语句,则需要用分号隔开。
  • 函数用func区分,由函数名、参数和函数体组成。
  • Golang的注释为/*...*/和//
package main
import "fmt"

func main(){
    fmt.Println("Hello world !") //自动换行
}

除了main函数,Go语言的init()函数也是一个重要的特性,如果有init()函数,执行在main之前,用于包的初始化。init函数可以有很多个,它们通常是顺序执行的。

(2). Go的变量

Golang中的变量可以由字母、数字(变量开头字符不能为数字)、下划线组成。

  • 声明变量以var关键字开头,其次是变量名、数据类型。
  • 如果声明时不指定值,且不进行后期赋值,对于int、float等数值数据为0,bool为false,字符串为空串,其余为nil。
  • 如果声明时不指定数据类型,直接进行赋值,会根据值判断变量类型
  • 声明变量以变量名:=值这样的格式进行,则相当于直接声明并赋值,为简写形式,只能在函数体存在,不能用于全局变量声明
  • 多变量声明可采取以上几种方式,变量之间用逗号隔开,类型形同或自动判断都可以
  • 字符串通过+进行连接
  • 全局变量中,int和float初始值为0,指针变量为nil
var index int = 3
var str,str2 string = "abc","def"

var aee int
aee = 5

var tmp = 3.25
tst:="aaabbb"

全局变量声明:

var (
    glb1 int
    glb2 string
)
var glb3,glb4 int = 5,6

关于空白标识符"_"的使用,如下getRtValue()函数只会返回一个值:

func main() {
  _,_,tmp := getRtValue()
}
(3). Go的常量

Golang和其他高级语言一样,拥有常量。

  • Golang的常量和变量声明类似,通过const关键字声明,同样可以不指定数据类型,以及进行多变量声明
  • 常量的枚举形式为const(xxx),且枚举中能且只能调用内置函数
  • 常量的值可以为iota,即Golang中常量的索引值,从0到最后一个常量,值为当前位置已有常量数量-1
  • 如果枚举常量中有多个变量,且第一个常量赋值,其余未赋值,则未赋值常量默认值为最近一个有值的变量的值
  • Golang中也存在类似于protected的机制,变量、常量、函数名等标识符命名为大写字母开头,可以被包外引用,小写字母则可以包内引用
const(
    cst1 = 1
    cst2 = "abc" 
    cst3 = len(cst2)
    cst4 = iota //值为3
    cst5 //输出值为3
)
(4). Go的数据类型

Golang中也有其他高级语言中常见的数据类型:数字数据类型、布尔数据类型、字符串数据类型和其他数据类型。

数字数据类型: 根据不同架构,无符号类型有uint8、uint16、uint32、uint64、uintptr(存放指针)、uint(32或64位),有符号类型有int8、int16、int32、int64、float32、float64、complex64(复数)、complex128等,其他数字类型有byte(8位)、rune(32位)、int(32或64位)。
布尔数据类型: bool,值为true/false。
字符串数据类型: string,字符串的值为字符拼接而成,字节使用UTF-8文本。
其他数据类型: 包括ptr指针数据类型、数组、结构体(struct)、Channel、函数、切片(slice)、interface、Map类型等。

  • 默认浮点数据类型采用float64,更为精确
  • Golang支持科学计数法表示数据,如0.156等价于.156,123.45等价于1.2345e2
  • Golang的字符类型通常用byte存储,而这种方式赋值为字符后需要通过格式化输入输出%c才能输出对应字符
  • Golang字符串的值赋值后不可修改
  • Golang字符采用单引号,字符串采用双引号""时能够进行转义字符转义,而变为``时不会转义,可用于防止利用字符串的异常行为
  • Golang的基本数据类型数字、布尔、字符串、结构体、数组等类型,直接存储值,通常在编译器用分配空间;一些复杂数据类型如Map、slice、channel等采用引用类型,存储指向一个地址,地址所在空间通常由分配,不存在引用则利用垃圾回收机制进行回收
(5). Go的数据类型转换

高级语言的类型转换,用于将一种 数据类型的变量转换为另一种类型的变量。

格式为:newType(oldTypeVar)

另外,Golang不支持隐式类型转换,如下:

var a int64 = 5
var b int32
b = a //报错

string和int之间的相互转换,使用strconv库:

a := "100" // a为string
b, err := strconv.Atoi(aStr) //b为int

b:= 200 // b为int
a:= strconv.Itoa(a) //a为string