介绍
- Go 即 Golang,是 Google 公司 2009 年 11 月正式对外公开的一门编程语言。
- 根据 Go 语言开发者自述,近 10 多年,从单机时代的 C 语言到现在互联网时代的 Java,都没有令人满意的开发语言,而 C++往往给人的感觉是,花了 100%的经历,却只有 60%的开发效率,产出比太低,Java 和 C#的哲学又来源于 C++。
- 并且,随着硬件的不断升级,这些 语言不能充分的利用硬件及 CPU。
- 因此,一门高效、简洁、开源的语言诞生了。
- Go 语言不仅拥有静态编译语言的安全和高性能,而且又达到了动态语言开发速度和易 维护性。
- 有人形容 Go 语言:Go = C + Python , 说明 Go 语言既有 C 语言程序的运行速度,又能达到 Python 语言的快速开发。
- Go 语言是非常有潜力的语言,是因为它的应用场景是目前互联网非常热门的几个领域比如 WEB 开发、区块链开发、大型游戏服务端开发、分布式/云计算开发。
- 国内比较知名的B 站就是用 Go 语言开发的,像 Goggle、阿里、京东、百度、腾讯、小米、360 的很多应用也是使用 Go 语言开发的。
命名规范
Go是一门区分大小写的语言。命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名。 Go语言从语法层面进行了以下限定:任何需要对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Analysize,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )
-
包名称
- 保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。
package domain package main
- 保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。
-
文件命名
- 尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
approve_service.go
- 尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
-
结构体命名
- 采用驼峰命名法,首字母根据访问控制大写或者小写
struct申明和初始化格式采用多行,例如下面:type MainConfig struct { Port string `json:"port"` Address string `json:"address"` }
- 采用驼峰命名法,首字母根据访问控制大写或者小写
-
接口命名命名规则基本和上面的结构体类型单个函数的结构名以 “er” 作为后缀,例如 Reader , Writer 。
- 命名以“er”结尾,如:
Writer,xxxHandler,Helper,Manager等 - 接口方法声明 = 方法名+方法签名如:
methodA (param1, param2)outputTypeListtype Reader interface { Read(p []byte) (n int, err error) }
- 命名以“er”结尾,如:
-
变量命名
- 和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写
- 但遇到特有名词时,需要遵循以下规则:如果变量为私有,且特有名词为首个单词,则使用小写
- 如 appService若变量类型为 bool 类型,则名称应以
Has,Is,Can或Allow开头var isExist bool var hasConflict bool var canManage bool var allowGitHook bool
常量命名常量均需使用全部大写字母组成,并使用下划线分词
const APP_URL = " https://www.baidu.com "
如果是枚举类型的常量,需要先创建相应类型:
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)
golang中关键字
var和const :变量和常量的声明
package and import: 导入
func: 用于定义函数和方法
return :用于从函数返回
defer someCode :在函数退出之前执行
go : 用于并行
select 用于选择不同类型的通讯
interface 用于定义接口
struct用于定义抽象数据类型
break、case、continue、for、fallthrough、else、if、switch、goto、default 流程控制
chan用于channel通讯
type用于声明自定义类型
map用于声明map类型数据
range用于读取slice、map、channel数据
注释
多行注释用/* */
单行注释 //
在goland中注释快捷键为:ctrl+/
GO main函数和init函数
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
在同一个包中仅允许有一个main函数,main函数是整个程序的入口,而且必须存在。此时package后面也必须跟main
go语言中 init 函数用于包 (package) 的初始化,该函数是go语言的一个重要特性。
有下面的特征:
- 1、init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
- 2、每个包可以拥有多个init函数
- 3、包的每个源文件也可以拥有多个init函数
- 4、同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)
- 5、不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- 6、init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
init函数和main函数的异同
相同点:
两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
init可以应用于任意包中,且可以重复定义多个。main函数只能用于main包中,且只能定义一个。- 两个函数的执行顺序:
对同一个go文件的init()调用顺序是从上到下的。
对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。
对于不同的package,如果不相互依赖的话,按照main包中”先import的后调用”的顺序调用其包中的init()
如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。
如果init函数中使用了println()或者print()你会发现在执行过程中这两个不会按照你想象中的顺序执行。
这两个函数官方只推荐在测试环境中使用,对于正式环境不要使用。
init()函数介绍
在Go语言程序执行时导入包语句会自动触发包内部init()函数的调用。
需要注意的是: init()函数没有参数也没有返回值。
init()函数在程序运行时自动被调用执行,不能在代码中主动调用它。
包初始化执行的顺序如下图所示:

变量
在go中定义变量的形式有三种,在go语言中,定义的变量必须要使用,否则会报错。
标准的语法:var 变量名 变量类型 = 变量值
第一种形式:
var num int = 100
第二种形式:
num2 := 100 // (最常用的)
第二种形式也是我们推荐在生产环境中使用的,简洁。
第三种形式:
var num3 int // (先定义类型然后赋值,全局变量初始化)
num3 = 100
fmt.Println(num3)
批量定义变量
批量定义多个变量时,变量的类型是相同的,定义后再对变量进行赋值。
var num4, num5 int
num4 = 100
num5 = 100
fmt.Println(num4, num5)
如果定义的这批量变中类型不尽相同时,可以使用var进行批量声明变量的类型
var (
name string
age int
)
name = "zhangsan"
age = 24
fmt.Println(name, age)
常量
在GO语言中,定义的常量无法改变,以实际项目中一般用于定义一些环境变量和配置等。这一点和python还不一样,需要注意。
const num10 = 100
//num10 = 200 // 常量一旦定义,不可修改
num11 := 100 // 变量可以修改同一种类型数据
num11 = 200
//num11 = "zhangsan" // 不能将一个int类型的数据,修改成其他类型
fmt.Println(num10, num11)
批量定义常量
const (
// 在同一个代码块里,相同的变量名字不能同时指定为变量和常量
//name string = "zhangsan"
age1 = 26
)
fmt.Println(name, age)




Asynq任务框架
MCP智能体开发实战
WEB架构
安全监控体系




