6.1 Hello World实例
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
保存到main.go
注意:若此时在 "package main"一行中报错:
go: go.mod file not found in current directory or any parent directory; see 'go help modules’,
请在终端中运行:go env -w GO111MODULE=off
若还报错,不妨尝试一下退出vscode,重新进入一下
1. 编译
go build hello.go
查看编译后的文件:
$ ls
main main.go
hello 为可执行文件,也是我们编译后的程序,直接运行:
$ ./hello
Hello, World!
2 编译 + 运行
运行以下命令行:
$ go run hello.go
输出
$ go run hello.go
Hello, World!
go run
做了编译和执行两动作,编译会生成 hello 文件,执行完成后此文件会被删除。
3 安装Go程序
$ go install hello.go
此操作会将可执行文件放置于 $GOPATH/bin
中,使用以下方法运行:
$ $GOPATH/bin/hello
Hello, World!
6.2 Web版 Hello World
下面是使用标准库 net/http 实现 Web 版本的 Hello World 程序:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
fmt.Println("Please Visit - http://localhost:8888/")
http.ListenAndServe(":8888", nil)
}
保存为 main.go ,运行代码:
$ go run hello.go
Please Visit - http://localhost:8888/
打开浏览器访问: localhost:8888/
6.3 Go 标记
Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:
fmt.Println("Hello, World!")
6 个标记是(每行一个):
1. fmt
2. .
3. Println
4. (
5. "Hello, World!"
6. )
6.4 行分隔符
在 Go 程序中,一行代表一个语句结束。
每个语句不需要像 C 家族中的其它语言一样以分号;结尾,因为这些工作都将由 Go 编译器自动完成,如果你打算将多个语句写在同一行,它们则必须使用;人为区分,但在实际开发中我们并不鼓励这种做法。
6.5 注释
注释不会被编译,每一个包应该有相关注释。
单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。
多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。
如:
// 注释1
/*
注释1
注释2
*/
6.6 标识符
标识符用来命名变量、类型等程序实体。
一个标识符实际上就是一个或是多个字母(A~Z 和 a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
Go 不允许在标识符中使用标点符号,例如@, $ 和 %。
Go 是一种区分大小写的编程语言。 因此,Manpower 和 manpower 在 Go 中是两个不同的标识符。
以下是有效标识符:
-
abc
-
s_l
-
_123
以下是无效标识符:
-
1abc(以数字开头)
-
case(Go语言的关键字)
-
a+b(运算符是不允许的)
6.7 关键字
Go语言一共有25个关键字,可以按照作用分为3类,分别为包管理、程序实体声明、程序流程控制。
1 包管理(2个)
import 、package
2 程序实体声明与定义(8个)
chan、const、func、interface、map、struct、type、var
3 程序流程控制(15个)
break、case、continue、default、defer、else、fallthrough、for、go、goto、if、range、return、select、switch
6.8 命名规范
1 简单的哲学
Go的设计哲学之一就是追求简单,因此在命名上一样秉承着简单的总体原则。要想做好 Go 标识符命名(包括 package 命名),至少要遵循两个原则:
-
简单且一致
-
利用上下文辅助命名
2 区分大小写的语言
命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名。 Go语言从语法层面进行了以下限定:任何需要对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。
当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:SetupRouter,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出。
命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的。
3 包名称
-
最好保持 package 的名字和目录保持一致。
-
尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。
-
包名应该为小写单词,尽量不要使用下划线或者混合大小写。
-
包名以及包所在的目录名,不要使用复数,例如,是net/utl,而不是net/urls。
-
不要用 common、util、shared 或者 lib 这类宽泛的、无意义的包名。
-
包名要简单明了,例如 net、time、log。
package controller
4 文件命名
尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
routers.go
user_controller.go
5 结构体命名
采用驼峰命名法,首字母根据访问控制大写或者小写。
type UserInfo struct {
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"type:varchar(11);not null;unique"`
Password string `gorm:"size:255;not null"`
}
6 接口命名
在 Go 语言中 interface 名字仍然以单个词为优先。命名规则基本和上面的结构体类型类似。对于拥有唯一方法或通过多个拥有唯一方法的接口组合而成的接口,Go 语言的惯例是一般用"方法名+er"的方式为 interface 命名,例如 Reader , Writer 。
type Writer interface {
Write(p []byte) (n int, err error)
}
type Reader interface {
Read(p []byte) (n int, err error)
}
type Closer interface {
Close() error
}
type ReadWriteCloser interface {
Reader
Writer
Closer
}
7 变量命名
和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写,但遇到特有名词时,需要遵循以下规则:
如果变量为私有,且特有名词为首个单词,则使用小写,如 appService;
若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头。
var isExist bool
var hasConflict bool
var canManage bool
8 方法的接收器命名
下面的代码里那个附加的参数p,叫做方法的接收器(receiver)
在Go语言中,我们并不会像其它语言那样用this或者self作为接收器;我们可以任意的选择接收器的名字。由于接收器的名字经常会被使用到,所以保持其在方法间传递时的一致性和简短性是不错的主意。这里的建议是可以使用其类型的第一个字母,比如这里使用了Point的首字母p。
type Point struct{ X, Y float64 }
func (p Point) Distance(q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
}
9 变量名字中不要带有类型信息
userSlice []*User // bad
users []*User // good
10 Error 的命名
Error 类型应该写成 FooError 的形式。
type ExitError struct {
// ....
}
Error 变量写成 ErrFoo 的形式。
var ErrFormat = errors.New("unknown format")
参考链接:Go 标识符的命名规范 - 知乎