包和文件名
Go源文件中非注释的第一行需要指明这个文件属于哪个包,每个 Go 应用程序都包含一个名为 main 的包,package main表示一个可独立执行的程序。要使用其它包的代码需要使用import引入包。
文件和文件夹名称一律小写,文件名称由多个单词组成使用下划线分隔或者直接拼接,文件夹名称一般不使用下划线,包名尽量和文件所在文件夹名称保持一致,main包除外。
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, World!")
}
标识符
当标识符(包括常量、变量、类型、函数名、结构字段等等)以大写字母开头时,可以被外部包的代码所使用,而标识符如果以小写字母开头则只能在包内部使用。
类型转换
Go类型转换格式和Delphi一样:
type_name(expression)
func main() {
value:=3.14
intValue:=int(value)
println(intValue)
}
指针
Go指针和C指针差不多,只不过Go在声明指针类型时,*要放在类型的前面,例如:
func main() {
var value int=100
var p *int=&value
fmt.Printf("p=%x,*p=%d\n",p,*p)//p=c000058080,*p=100
}
Go语言中对象的地址可能发生变化,因此指针不能从其它非指针类型的值生成,当内存发送变化的时候,相关的指针会同步更新,但是非指针类型例如uintptr不会做同步更新。
左大括号
函数,if,switch等的左大括号不能单独放在一行,否则编译会报错。
错误:
func main()
{
fmt.Println("Hello, World!")
}
正确:
func main() {
fmt.Println("Hello, World!")
}
行分隔符
在 Go中,一行代表一个语句结束,每个语句不需要以分号结尾,如果要将多个语句写在同一行则需要分号区分,但不建议这么做。
程序的初始化和执行
Go语言程序的初始化和执行总是从main包的main函数开始的,如果main包导入了其它的包,则会按照某种顺序(一般可能是文件名或包路径名的字符串顺序)将它们包含进main包里。
如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的init函数。
如果一个包有多个init函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同一个文件内的多个init则是以出现的顺序依次调用(init不是普通函数,可以定义有多个,所以也不能被其它函数调用)。
最后,当main包的所有包级常量、变量被创建和初始化完成,并且init函数被执行后,才会进入main包的main函数,程序开始正常执行。
要注意的是,在main包的main函数执行之前所有代码都运行在同一个goroutine,也就是程序的主系统线程中。因此,如果某个init函数内部用go关键字启动了新的goroutine的话,新的goroutine只有在进入main.main函数之后才可能被执行到。
网友评论