前言
最近心情格外不舒畅,不仅仅是对前途的迷茫,这种迷茫倒是我自己的问题还好,关键它是我们这种普通吗喽抗衡不了的。
那就换个脑子,学点新东西吧,比如 Go?
1、Go 语言入门
介绍就没必要多说了,Go 语言的作者是 B语言、C语言 和 Unix 支付联合开发的,所以可以预见这门语言不会差!而且事实也确实是这样。不得不感慨外国那群搞技术的人是真牛啊。
1.1、Go 环境安装
Go 语言官网 Go下载 - Go语言中文网 - Golang中文社区 下载安装包
安装后使用 go version 进行安装的验证
创建 Go 的工作目录并设置为系统环境变量 GOPATH,创建下面三个目录:
用户变量 GOPATH 默认会有一个工作目录,所以需要覆盖掉:
检查安装成功:
1.2、Hello World
Go 语言的执行必须在 main 包下 :
package main import "fmt" func main() { fmt.Print("Hello World") }
注意:这个包可以是不存在的,也就是它可以不是一个目录!
运行结果:
注意:必须在 GOROOT 环境下去执行
当然,我们也可以去 go 文件所在的文件夹去打开,然后通过 go run 来执行该文件:
注意:必须要把要执行的 go 文放在 main 包下!
如果在运行过程中,出现了下面的报错:
需要关闭 go 环境变量中的 GO111MODULE :
- GO111MODULE 是一个环境变量,它用于控制Go语言的包管理方式。
在Go 1.11版本之前,Go语言使用 GOPATH 模式来管理项目和依赖包,所有的代码和依赖都需要存放在$GOPATH目录下。随着Go 1.11版本的发布,引入了一种新的包管理方式,即模块(module)系统,这个系统允许开发者在不依赖于GOPATH的情况下管理和构建项目。
具体来说,GO111MODULE 环境变量可以设置以下三个值:
- on:开启模块支持,此时Go命令行会完全使用模块机制来管理依赖,而不会去GOPATH目录下查找。
- off:关闭模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- auto(默认值):自动模式,go命令行将会根据当前目录来决定是否启用module功能。如果当前目录在GOPATH/src之外且该目录包含go.mod文件,或者当前文件在包含go.mod文件的目录下面,则会开启模块支持。
1.3、注释
Go 语言的注释和 Java 几乎一样
1.4、变量
Go 语言是一种静态类型和编译型语言。
- Go语言使用静态类型系统,这意味着变量的类型在编译时就已确定,有助于在编译阶段捕获错误,提高代码的安全性。
- 同时,Go语言是编译型语言,源代码在执行前需要被编译成机器码。
1.4.1、变量的定义
var name type
同时定义多个变量:
var ( name string // 默认为空 age int // 默认为 0 )
注意:可以不给变量赋初始值,它会有默认值。
- 此外,布尔值默认为 false,切片、函数、指针变量的默认值为 nil。
1.4.2、变量的标准初始化
// 使用 var 可以省去类型 var addr = "beijing" // 初始化多个变量 var ( name string = "zs" age int = 18 ) // 初始化单个变量 var addr string = "beijing"
1.4.3、端变量的初始化(自动推导)
省去 var,可以使用 := 来进行变量类型的自动推导
name := "zs" age := 18 fmt.Println(name,age) // %T 代表变量的类型 fmt.Printf("%T,%T",name, age)
运行结果:
注意:被 := 初始化过的变量不能再初始化了!
1.4.4、打印内存地址
可以使用 Pringf 的 %p 结合 &变量 来实现内存地址的打印(& 也叫取地址符),但是这种取地址的方法只适合与数值类型,因为数值类型存储的是数值,需要用取地址符来取得数值地址,而引用类型本身就是存储的就是地址,不需要再取:
name := "zs" fmt.Println(name) fmt.Printf("name=%s,内存地址=%p\n",name,&name) name = "ls" fmt.Printf("name=%s,内存地址=%p",name,&name)
运行结果:
可以看到,即使一个变量的值发生了变化,但是它的内存地址是不会变化的。
1.4.5、变量交换
在别的语言中,变量的交换通常需要借助一个中间变量来实现:
var tmp int tmp = a a = b b = tmp
但是 Go 语言提供了一个特别简洁的语法:
var a,b int = 100,200 println("a =",a,"b =",b) a,b = b,a println("a =",a,"b =",b)
注意:这里使用了 println 输出的,看起来简单了很多,但是它是标准错误输出!
1.4.6、匿名变量
匿名变量就是一个下划线,它可以用于变量的声明或赋值,但是任何赋给这个标识符的值都将被抛弃。
所以这个匿名变量一般用于我们不需要这个值的时候(一般是返回值)。
package main func test()(int,int) { return 100,200 } func main() { a,_ := test() println(a) }
这里,我们不需要第二个返回值,但是接受返回值的时候又不能不写,所以直接使用匿名变量抛弃掉。
匿名变量不占用内存,不会分配内存。匿名变量和匿名之间也不会因为多次初始化而无法使用。
1.4.7、变量的作用域
Go 语言中同样是分类局部变量和全局变量,在 Go 语言中,如果全局变量名和局部变量名相同,调用时会使用就近原则:
// 全局变量 var name string = "hive" func main() { // 局部变量 name := "s" println(name) }
这里我们的局部变量 name 并不是在重新初始化(在 Go 语言中一个变量只能被初始化一次,除了匿名变量),而是一个全新的变量。
1.5、常量
1.5.1、普通常量
常量就是在程序运行时,不能被修改的值。在 Go 语言中,常量只能是布尔型、数值型和字符串类型。
const URL string = "www.csdn.com" // 显示定义 const USERNAME = "lyh" // 隐式定义 const a,b,c = 1,2,3 // 同时定义多个常量
注意:在 Go 语言中,常量和全局变量不使用不会报错,但是变量定义了必须使用。
1.5.2、iota
iota 是一个特殊的常量,可以认为是一个可以被编译器修改的常量。iota 是 go 语言的常量计数器。
iota 在 const 关键字处显示会被重置为 0 ,const 中每新增一行就会 +1 。
package main import "fmt" func main() { const ( a = iota // 0 b = iota // 1 c = iota // 2 ) fmt.Println(a,b,c) const ( d = iota // 0 e // 1 f // 2 g = "hello" // iota依然会自增 h // 默认和上面的值是一样的 hello i = iota // 5 ) fmt.Println(d,e,f,g,h,i) }
运行结果:
Go 语言基础之基本语法(2)https://developer.aliyun.com/article/1534246