编辑
2022-12-30
🧰语言-go
00
请注意,本文编写于 902 天前,最后修改于 225 天前,其中某些信息可能已经过时。

目录

简单的go示例程序
常见命令
关键字
标识符
基本内置类型

简单的go示例程序

go
package main // 指定当前源文件所在的包名 import "math/rand" // 引入一个标准库包 const MaxRand = 16 // 声明一个具名整型常量 // 一个函数声明 /* StatRandomNumbers生成一些不大于MaxRand的非负 随机整数,并统计和返回小于和大于MaxRand/2的随机数 个数。输入参数numRands指定了要生成的随机数的总数。 */ func StatRandomNumbers(numRands int) (int, int) { // 声明了两个变量(类型都为int,初始值都为0) // 内置基本类型int var a, b int // 一个for循环代码块 for i := 0; i < numRands; i++ { // 一个if-else条件控制代码块 if rand.Intn(MaxRand) < MaxRand/2 { a = a + 1 } else { b++ // 等价于:b = b + 1 } } return a, b // 此函数返回两个结果 } // main函数,或主函数,是一个程序的入口函数。 func main() { var num = 100 // 调用上面声明的StatRandomNumbers函数, // 并将结果赋给使用短声明语句声明的两个变量。 x, y := StatRandomNumbers(num) // 调用两个内置函数(print和println)。 print("Result: ", x, " + ", y, " = ", num, "? ") println(x+y == num) }
  • 单次package、import、const、func、var、for、if、else和return均为关键字
  • 一般print和println这两个内置函数并不推荐使用。在正式的项目中,我们应该尽量使用fmt标准库包中声明的相应函数。
  • StatRandomNumbers函数的声明体中使用了两个流程控制代码块。其中一个是for循环代码块,它内嵌了另外一个代码块,另外一个代码块是一个if-else条件控制代码块。

常见命令

  • go run
    子命令不推荐在正式的大项目中使用。go run 子命令只是一种方便的方式来运行见得go程序

  • go build 用来构建可执行程序文件来运行go文件

  • go install 用来构建可执行程序文件来运行go文件 go run go build go install 只会输出代码语法错误

  • go vet 可以用来检查可能的代码逻辑错误(即警告)

  • go fmt 来用同一种代码风格格式化go代码

  • go test 运行单元和基准测试用例

  • go doc 在终端中查看go代码库包的文档

关键字

关键字是一些特殊的用来帮助编译器理解和解析源代码的单词

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

这些关键字分为四组:

  • const、func、import、package、type和var用来声明各种代码元素
  • chan、interface、map和struct用做一些组合类型的字面表示中
  • break、case、continue、default、else、fallthrough、for、goto、if、range、return、select和switch用在流程控制语句中
  • defer和go也可以看作是流程控制关键字,但它们有一些特殊的作用

标识符

一个标识符是一个以Unicode字母或者_开头并且完全由Unicode字母和Unicode数字组成的单词:

  • unicode字母是在Unicode标准8.0中的Lu、Li、Lt、Lm和Lo分类中的字符
  • unicode数字是定义在unicode标准8.0的Nd数字字符分类中的字符

注意:关键字不能被用做标识符 标识符_是一个特殊字符,它叫做空标识符

我们将知道所有的类型名、变量名、常量名、跳转标签、包名和包的引入名都必须是标识符

一个由Unicode大写字母开头的标识符称为:导出标识符。这里导出可以被理解为公开。其他标识符称为非导出标识符。非导出可以被理解为私有。 东方字符都被视为非导出字符,非导出有时候也被称为未导出 下面是一些合法的导出标识符:

Player_9 DoSomething VERSION Ĝo Π

不合法的未导出标识符

_ _status memStat book π 一个类型 변수 エラー

下面这些不能用做标识符

// Unicode数字开头 123 3apples // 含有不符合要求的Unicode字符 a.b *ptr $name a@b.c // 这两个是关键字 type range

基本内置类型

go支持如下内置基本类型:

  • 一种内置布尔类型:bool
  • 11种内置整数类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、int、uint和uintptr
  • 两种内置浮点数类型:float32和float64
  • 两种内置复数类型:complex64和complex128
  • 一种内置字符串类型:string

go中有两种内置类型别名(type alias):

  • byte是uint8的内置别名。我们可以将byte和uint8看作是同一个类型
  • rune是int32的内置别名。我们可以将rune和int32看作是同一个类型

以u开头的整数类型称为无符号整数类型。无符号整数类型的值都是非负的。 一个数值类型名称中的数字表示每个这个类型的值将在内存中占有多少二进制位,二进制位通常被称为比特(bit)

比如,一个uint8中的值占有8位。我们称uint8类型的值的尺寸是8位。因此,最大的uint8值是255(2的8方-1),最大的int8值是127(2的7方-1),最小的int8值是-128(-27)

更多的时候,我们使用字节(byte)做为值尺寸的度量单位。一个字节相当于8个比特。所以uint32类型的尺寸为4,即每个unit32值占用4个字节。

尽管布尔和字符串类型分类各自只有一种内置类型,我们可以声明定义更多自定义布尔和字符串类型。 所以,go代码中可以出现很多布尔和字符串类型。下面是一个类型声明的例子。在这些例子中,type是一个关键字

// 一些类型定义声明 type status bool // status和bool是两个不同的类型 type MyString string // MyString和string是两个不同的类型 type Id uint64 // Id和uint64是两个不同的类型 type real float32 // real和float32是两个不同的类型 // 一些类型别名声明 type boolean = bool // boolean和bool表示同一个类型 type Text = string // Text和string表示同一个类型 type U8 = uint8 // U8、uint8和 byte表示同一个类型 type char = rune // char、rune和int32表示同一个类型

我们将上面定义的real类型和内置类型float32都称为float32类型 (注意这里的第二个float32是一个泛指,而第一个高亮的float32是一个特指)。 同样地,MyString和string都被称为字符串(string)类型,status和bool都被称为布尔(bool)类型。

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!