package main
import "fmt"
func main() {
/*输出"Hello World!"*/
fmt.Println("hello, world")
}
第 1 行 package main 定义了包名。必须在源文件中非注释的第 1 行指明这个文件属于哪个包,例如 package main。package main 表示一个可独立执行的程序,每个Go语言应用程序都需要包含一个名为 main 的包,并且该包中包含一个名为 main() 的函数(该函数是Go语言可执行程序的执行起点,既不能带参数,也不能定义返回值)。
第 2 行 import "fmt" 中 import 语句用于导入该程序所依赖的包。由于本示例程序中用到了 Println() 函数,而该函数属于 fmt 包,所以需要导入 fmt 包,fmt 包实现了格式化 I/O(输入/输出)。
第 3 行 func main() 是程序入口。所有Go语言函数都是以关键字 func 开头的,每一个可执行程序都必须包含一个 main() 函数,这个 main() 函数通常是程序启动后第一个执行的函数,如果有 init() 函数则会先执行 init() 函数。
第 4 行 /*...*/ 是程序的注释,也可以用//来进行单行注释,在程序执行时,注释的部分将被程序忽略,不会执行。
第 5 行 fmt.Println(...) 用来将字符串输出到控制台,并在最后自动增加一个换行字符 \n
。使用 fmt.Print("Hello, World!\n") 也会得到相同的结果。
除此之外,还有以下几点值得注意:
包是结构化代码的一种方式,对外表现为包含一个或多个.go文件的目录,每个.go 文件都属于且仅属于一个包,一个应用程序可以包含不同的包。
属于同一个包的源文件必须全部被一起编译,一个包即是编译时的一个单元,因此根据惯例,每个目录都只包含一个包。
如果对一个包进行更改或重新编译,所有引用了这个包的客户端程序都必须全部重新编译。
func function_name( [parameter list] ) [return_types] { 函数体 }
实例
package main
import "fmt"
/* 定义函数swap,功能是实现两个参数的互换,有两个参数x和y,两个返回值的类型都是string类型 */
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("var1", "var2")
fmt.Println(a, b)
}
main()
函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init()
函数则会先执行该函数)。main()
函数既没有参数,也没有返回类型。
在程序开始执行并完成初始化后,第一个调用(程序的入口点)的函数是 main.main()
。
函数里的代码(函数体)使用大括号 {}
括起来。
左大括号 {
必须与方法的声明放在同一行,这是编译器的强制规定,否则你在使用 gofmt 时就会出现错误
Go 语言虽然看起来不使用分号作为语句的结束,但实际上这一过程是由编译器自动完成,因此才会引发像上面这样的错误
对于大括号 {}
的使用规则在任何时候都是相同的(如:if
语句等)。
因此符合规范的函数一般写成如下的形式:
func functionName(parameter_list) (return_value_list) { … }
单行注释://
多行注释:也叫块注释,均已以 /*
开头,并以 */
结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
变量(或常量)包含数据,这些数据可以有不同的数据类型,简称类型。使用 var
声明的变量的值会自动初始化为该类型的零值。类型定义了某个变量的值的集合与可对其进行操作的集合。
类型可以是基本类型,如:int
、float
、bool
、string
;结构化的(复合的),如:struct
、array
、切片 (slice)、map
、通道 (channel);只描述类型的行为的,如:interface
。
结构化的类型没有真正的值,它使用 nil
作为默认值。值得注意的是,Go 语言中不存在类型继承。
每个值都必须在经过编译后属于某个类型(编译器必须能够推断出所有值的类型),因为 Go 语言是一种静态类型语言。