实践:Go 语言入门指南:基础语法|青训营

105 阅读4分钟

一、结构

  1. go文件的后缀是 go
  2. pckage main

表示该hello.go 文件所在的包是main,在go中,每个文件必须归属于一个包。

import “fmt”

表示,引入一个包,包名fmt,引入该包后,就可以使用fmt包的函数,比如:fmt.Println

  1. func main

func 是一个关键字,表示一个函数

mian 是函数名,是一个主函数,即程序入口。 调试运行必须要有main

fmt.Println(“hello”)

表示调用fmt包的函数Println输出:“hello,world”

这里我采用的是Goland平台进行开发,所以调试起来很方便,一键run

二、语法

2.1 变量

变量表示没有固定值且可改变的数,计算机课中我们又了解到变量是一段或多段用来存储数据的内存。作为静态类型的Go语言来说,Go的变量总是有固定的数据类型,类型决定了变量内存的长度和存储格式。我们可以修改变量的变量值,但是无法更改变量的变量类型

2.2 类型

  • 引用类型
    引用类型特指slicemapchannel这三种预定义类型。
    引用类型拥有更复杂的存储结构,除了分配内存以外,它们还须初始化一系列的属性,例如:指针、长度,甚至包含哈希分布、数据队列等。
    内置函数new可以按照指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式。而引用类型必须使用make函数创建,编译器会将make转换为目标类型专用的创建函数(或指令),以确保完成全部内存分配和相关属性初始化。

  • 整数类型
    Go语言的数值类型分为以下几种:整数、浮点数、复数,其中每一种都包含了不同大小的数值类型,例如有符号整数包含 int8int16int32int64 等,每种数值类型都决定了对应的大小范围和是否支持正负符号。
    大多数情况下,我们只需要 int 一种整型即可,它可以用于循环计数器(for 循环中控制循环次数的变量)、数组和切片的索引,以及任何通用目的的整型运算符,通常 int 类型的处理速度也是最快的。

  • 浮点数类型
    Go语言提供了两种精度的浮点数 float32float64,它们的算术规范由 IEEE754 浮点数国际标准定义,该浮点数规范被所有现代的 CPU 支持。
    一个 float32 类型的浮点数可以提供大约 6 个十进制数的精度,而 float64 则可以提供约 15 个十进制数的精度,通常应该优先使用 float64 类型,因为 float32 类型的累计计算误差很容易扩散,并且 float32 能精确表示的正整数并不是很大。

  • 复数类型
    Go语言中复数的类型有两种,分别是 complex128(64 位实数和虚数)和 complex64(32 位实数和虚数),其中 complex128 为复数的默认类型。
    复数的值由三部分组成 RE + IMi,其中 RE 是实数部分,IM是虚数部分,REIM 均为 float 类型,而最后的 i 是虚数单位。
    对于一个复数z := complex(x, y),可以通过Go语言的内置函数real(z)来获得该复数的实部,也就是 x;通过imag(z)获得该复数的虚部,也就是 y。

  • 布尔类型
    一个布尔类型的值只有两种:truefalse。if 和 for 语句的条件部分都是布尔类型的值,并且==<等比较操作也会产生布尔型的值。
    布尔型无法参与数值运算,也无法与其他类型进行转换。

  • 字符串类型
    字符串是一种值类型,且值不可变,即创建某个文本后将无法再次修改这个文本的内容,更深入地讲,字符串是字节的定长数组。
    可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果,常用的转义字符包括:

  • \n:换行符

  • \r:回车符

  • \t:tab 键

  • \u\U:Unicode 字符

  • \:反斜杠自身

  • 字符类型
    字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
    Go语言的字符有以下两种:

  • 一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。

  • 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。

  • 类型转换
    Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:valueOfTypeB = typeB(valueOfTypeA)
    只有相同底层类型的变量之间可以进行相互转换(如将 int16 类型转换成 int32 类型),不同底层类型的变量相互转换时会引发编译错误(如将 bool类型转换为 int类型)。