Golang入门指南
本文旨在为前端开发者提供一些学习Golang的帮助
Hello World
准备工作
Go官网下载地址:golang.org/dl/
配置环境变量
-
GOROOT
指的是golang 的安装路径
-
GOBIN
go install编译后的存放路径。
-
GOPATH
它指的是GO运行环境中的环境变量:
$GOPATH内部存在三个子目录
- src 存放网上下载的源代码
- pkg 编译是生成的中间文件
- bin 编译后生成的可执行文件,一般将其加入**$PATH**变量,这样就可以直接在终端中使用这些可执行文件
Hello Golang
选择某一文件夹下,新建一个main.go文件,输入以下代码
package main
import "fmt"
func main() {
fmt.Println("Hello World")
fmt.Println("Hello Golang")
}
然后在终端输入go run main.go,即可成功显示Hello World 与 Hello Golang
init函数与main函数
go语言中,存在两种特殊的函数,init函数与main函数
init函数
init函数用于包(package)的初始化,它具有以下特征
- init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
- 一个包可以拥有多个init函数,按照呈现给编译器的顺序被调用
- 一个包只能初始化一次,即使是从多个包导入的
main函数
go语言的入口函数
func main() {
// 函数体
}
示例
-
非main包(package)是不可以run的
package test import "fmt" func foo() { fmt.Println("a") } foo()执行go run test.go,会得到以下报错:
-
普通函数无法直接在非main函数体外执行
package main import "fmt" func foo() { fmt.Println("a") } foo()执行
go run test.go, 会得到以下报错:
正确演示:
package main
import "fmt"
func foo() {
fmt.Println("foo")
}
func main() {
foo()
}
go run 与 go build
在node中,我们执行文件只有node inde.js这一种方式,而对于golang而言,它本身支持静态编译,编译好,直接可以放服务器运行,而go run 与go build 正是这种区别
-
go run [文件]
本地运行该文件
-
go build [文件]
编译源文件,生成可执行文件
对于上面的Hello World代码,我们执行go build,即可得到可执行文件
点击main文件,可以再次看到Hello World 与 Hello Golang
命名
Go语言中的命名都遵循一个简单的命令规则:
一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。
关键字
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
特殊名字
内建常量: true false iota nil
内建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
内建函数: make len cap new append copy close delete
complex real imag
panic recover
这些名字虽然不是关键字,但可以在定义中重新使用它们。如下面代码所示:
package main
import "fmt"
func main() {
var true = 1
fmt.Println("true为: ", true)
}
执行后如下图所示
声明与使用
如果一个名字如果在函数内部定义,那么它只在这个函数内部有效。如果是在函数外部定义,那么它将在当前包的所有文件中可以访问
如下面代码所示
package main
import "fmt"
func main() {
fmt.Println(foo)
bar()
}
var foo = "foo"
func bar() {
fmt.Println("bar")
}
而如果在函数内先使用后声明则会报错, 如下面代码所示
package main
import "fmt"
func main() {
fmt.Println(foo) // 未解析的引用 'foo'
bar() // 未解析的引用 'bar'
var foo = "foo" // 未使用的变量 'foo'
bar := func() { // 未使用的变量 'bar'
fmt.Println("bar")
}
}
大小写
名字的开头字母的大小写决定了名字在保外的可见性。如果一个名字是大写字母开头,且必须在函数外部定义的名字,它将是导出的,即可以被外部的包访问,例如fmt包的Println函数就是导出,可以在fmt包外部访问。
而对于包名而言,一般总是用小写字母
驼峰优先
Go语言一般推荐使用驼峰式命名
声明
包声明
包要求在同一个目录下中的所有文件的第一行添加如下代码,以标记该文件归属的包
package 包名
包的特性如下
-
一个目录下的同级文件归属同一个包
如下面代码所示
// test/foo package test import "fmt" func Foo() { fmt.Println("foo") } // test/bar package test import "fmt" func Bar() { fmt.Println("bar") } // main.go package main import "./test" func main() { test.Foo() test.Bar() } -
包名可以与其目录名不同名
-
包名为 main 的包为应用程序的入口包,编译源码没有 main 包时,将无法编译输出可执行的文件。
变量声明
Go语言的变量声明格式为
var 变量名 变量类型
var 变量名 变量类型 = 表达式
如:var name string = "Bob"
批量声明
Go语言也支持批量声明,其格式为:
var (
a string
b init
c bool
d float32
)
短变量声明
在函数内部,可以采用:=的方式来声明并初始化变量
package main
import "fmt"
func main() {
foo := "foo"
fmt.Println(foo)
}
匿名变量
go语言的函数是允许返回多个返回值。在使用过程时,常常会出现只想使用一个返回值的情况。此时如果另一个返回值也用变量命名,便会提示未使用该变量。
在这种情况下,我们就可以使用匿名变量,来忽略某个值,匿名变量用一个下划线_来表示
package main
import "fmt"
func foo() (string, int) {
return "foo", 1
}
func main() {
x, _ := foo()
_, y := foo()
fmt.Println(x)
fmt.Println(y)
}
常量
常量的命名方式与JS相同,都是使用const关键字,且常量在定义的时候必须赋值
const pi = 3.1415
const e = 2.7182
// 批量声明
const (
pi = 3.1415
e = 2.7182
)
const 同时声明多个变量时,如果省略值则表示它与上面一行的值一致,如
const (
a = 100
b
c
)
// a,b,c的值都为100