1、Hello Word
go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
-
package关键字:声明Go文件属于哪个包
package main:Go程序的入口,Go运行时会从main包的main()函数开始执行。
-
import关键字:导入需要调用的包
以上案例中,需要调用
fmt
包下的Println()
函数。 -
func关键字:声明一个函数
func main():Go程序的主入口函数,Go运行时从main()函数开始执行。
2、包
-
简介
Go中,所有程序文件都是通过包联系在一起的,包是Go导入其他Go程序文件的基本单元,而不是Go文件。包可以简单理解为是一个文件夹,包内共享所有变量,常量,以及所有定义的类型。
包的命名风格建议都是小写字母,并且要尽量简短
。包是Go导入其他Go程序文件的基本单元:
例如有一个num包,底下有两个Go文件num1.go和num2.go,当main中要使用num1.go的函数时,需要import num包,此时也会讲num2.go导入,而无法只导入num1.go。
-
Go的可见性
在Java中,使用
public、private、protected
关键字表明变量、常量、方法等的可见性,但在Go中,使用声明的名称首字母大小表明可见性,且只有包外可见和包内可见两种可见性,-
首字母大写:公有类型/变量/常量,即包外可见。
-
首字母小写:私有类型/变量/常量,即包内可见。
-
go
package visibility
const PubParam = "my_public_param"
const priParam = "my_private_param"
-
包的导入
-
导入包,可以使用这个包内公有的类型、变量、常量。
-
导入一个包
goimport "visibility"
-
导入多个包
goimport ( "visibility1" "visibility2" )
-
导入的包取别名
goimport ( v1 "visibility1" v2 "visibility2" )
-
匿名导入包,别名为
_
时为匿名导入,匿名导入的包无法使用其中声明的函数,匿名导入的目的只有一个,就是加载其中的init函数。goimport ( v1 "visibility1" _ "visibility2" )
-
init函数
在Go中,init函数是一种特殊的函数,在包被导入时执行初始化,当一个包内有多个go文件,Go会依次执行每个go文件的init函数(如果有声明init函数的话)。
gofunc init() { fmt.Println("init") }
-
-
-
特殊的导入方式:允许直接使用导入包中的函数和变量,而无需使用包名前缀。
go//问题:因使用导入的包的函数或变量无需使用包前缀,所以在当前如果有相同名称的函数或变量, // 则会冲突,编译不通过。 package main import ( . "visibility" )
注意:
Go中,包无法循环依赖,无论直接还是间接。
-
-
内部包
在Go语言中,内部包(internal packages) 是一种特殊的包管理机制,用于限制包的可见性。通过内部包,开发者可以定义一些仅供特定模块或项目内部使用的包,从而避免这些包被外部项目直接引用。这种机制有助于维护代码的封装性和模块化。
当如果有一个包只需要在特定模块内使用,则在该模块文件夹下创建
internal
目录(包),则该包下的所有Go文件,只能在该模块下使用,不能被模块外的其他Go文件所导入。
3、注释
Go中支持单行注释和多行注释。
go
// 定义一个包名
package main
import "fmt"
/**
* 程序的入口
*/
func main() {
fmt.Println("hello world")
}
4、标识符
-
作用:用于包、函数、变量、常量等的命名。
-
标识符命名规则
- 只能由字母、数字、下划线组成。
- 只能以
字母和下划线
开头。 严格区分大小写
。- 不能与任何已存在的标识符重复,即包内唯一的存在。
- 不能与 Go 任何内置的关键字冲突。
-
Go内置的关键字
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 |
5、运算符
- 运算符优先级
操作 | 优先级 |
---|---|
* / % << >> & &^ | 5 |
+ - | 4 |
== != < <= > >= | 3 |
&& | 2 |
|| | 1 |
-
复用运算符(
^
)- 两个数字使用
^
时(a ^ v),属于异或运算(两个输入值不同,输出真,两个输入值相同,输出假)。 - 一个数字使用
^
时(^a),取反运算符。
- 两个数字使用
-
增强赋值运算符
goa += 1 a /= 2 a &^= 2
-
自增/自减
- Go不支持
前自增/前自减
,只支持后自增/后自减
。
goa++ // 正确 ++a // 错误 a-- // 正确
- Go自增/自减不具有返回值。
goa = b++ //该语法错误
- Go不支持
6、字面量
- 字面量,按照计算机科学的术语来讲是用于表达源代码中一个固定值的符号,也叫字面值。也就是字面意义上的值。
- 字面量的分类
-
整型字面量
go2 3 1
-
浮点字面量
go3.4 4.321
-
复数字面量
go4i 313i
-
字符字面量
go'a' '你'
-
转义字面量
go\a U+0007 响铃符号 \b U+0008 回退符号 \f U+000C 换页符号 \n U+000A 换行符号 \r U+000D 回车符号 \t U+0009 横向制表符号 \v U+000B 纵向制表符号 \\ U+005C 反斜杠转义 \' U+0027 单引号转义 (该转义仅在字符内有效) \" U+0022 双引号转义 (该转义仅在字符串内有效)
-
字符串字面量
go"hello go"
-
7、函数
-
函数声明的关键字:
func
gofunc main(){ fmt.Println("hello word") }
-
Go函数的两个特点
- 参数类型后置
gofunc hello(name string){ fmt.Println(name) }
- 允许多个返回值
gofunc index()(a ,b int){ a= 1 b= 2 return a,b }
8、风格
-
关于编码风格这一块 Go 是强制所有人统一同一种风格,Go 官方提供了一个格式化工具
gofmt
,通过命令行就可以使用,该格式化工具没有任何的格式化参数可以传递,仅有的两个参数也只是输出格式化过程,所以完全不支持自定义。 -
Go中一些规则
-
函数花括号换行
在Go中,所有的左花括号都不允许换行。
go//编译不通过 func hello() { fmt.Println("hello go") }
-
代码缩进
-
代码间隔
-
花括号省略
-
三元表达式
Go中没有三元表达式。
-