[Go语言系列] 6 Go语言基础语法

Go语言系列知识快速查看入口

:point_down::point_down::point_down:



本章内容

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!

参考链接:Go 语言基础语法:Hello World 实例 | Go 技术论坛

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/

参考链接:Go 语言基础语法:Hello World 实例 | Go 技术论坛

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 标识符的命名规范 - 知乎