02.开始认识go
一、一切从main开始
go和大部分编程语言一样,都有一个统一的main函数,表示程序启动入口。
// 的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,
// 每个 Go 应用程序都包含一个名为 main 的包
package main
/*
* 下一行 import "fmt",告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),
* fmt 包实现了格式化 IO(输入/输出)的函数
*/
import (
"fmt"
)
/*
* func main() 是程序开始执行的函数。 如果有 init() 函数则会先执行该函数
* main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数
*/
func main() {
/*
* 下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。
* 使用 fmt.Print("hello, world\n") 可以得到相同的结果。
* Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台
*/
fmt.Println("hello world")
}
ps: 注释与其他一样
// 下一行 /.../ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,
// 你可以在任何地方使用以 // 开头的单行注释。
// 多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,
// 多行注释一般用于包的文档描述或注释成块的代码片段。
二、跨文件引用
我们在class.go.com目录下创建目录class1,生成文件vscode.go:
// vscode
package vscode
/*
* 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1
* 那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);
* 标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
*/
func HelloVSCode() string {
return sayhello() + "vscode"
}
//string是返回类型,这个方法为protected
func sayhello() string {
return "hello "
}
main.go调用方法
package main
//import我们看到引用了 vscode这个包。路径在class.go.com/class下面
import (
"fmt"
vscode "class.go.com/class1"
)
func main() {
fmt.Println(vscode.HelloVSCode()) //输出hello vscode
}
class1目录下生成文件xcode.go
// 这里尝试改包名改成非vscode。
// 发现会报错,说明同个目录下只能有一个包名
package vscode
// 这里可以直接使用sayhello()方法,
// 说明内部protected方法,跨文件同个包内也可以使用
func HelloXCode() string {
return sayhello() + "Xcode"
}
main.go调用方法
package main
//import我们看到引用了 vscode这个包。路径在class.go.com/class下面
import (
"fmt"
vscode "class.go.com/class1"
)
func main() {
fmt.Println(vscode.HelloXCode()) //输出hello xcode
}
创建另外一个目录class1package,生成文件IDE.go
// 这里尝试将包名,改成vscode。
// 发现报错,说明不同文件。不能使用已有的包名
package IDE
/*
* 这里尝试调用sayHello()方法,发现报错。说明跨文件,不能调用不同包内的protected名方法
* 我们创建同一个sayhello()、HelloXCode()方法,没发现报错。说明不同包名,可有相同名字的方法
* 声明HelloIDE() public方法,这个方法有一个字符串类型入参IDEName
*/
func HelloIDE(IDEName string) string {
return sayHello() + IDEName
}
func HelloXCode() string {
return sayHello() + "Xcode"
}
func sayHello() string {
return "HI "
}
main.go 调用
package main
import (
"fmt"
vscode "class.go.com/class1"
IDE "class.go.com/class1package"
)
func main() {
fmt.Println(IDE.HelloIDE("sublime"))
fmt.Println(IDE.HelloIDE("eclipe"))
fmt.Println(IDE.HelloXCode())
}
这里说明了go 包名的另外几个特点:
- 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
- 文件夹名与包名没有直接关系,并非需要一致。
- 同一个文件夹下的文件只能有一个包名,否则编译报错
- 跨文件同包名的go文件,可以直接访问其他同包名文件的protected方法
- 不同目录下面的go文件,不能声明已有包名。
- 不能直接访问其他包内的protected方法,不同包可直接声明相同名字的方法
- 引入其他目录下的go文件,通过import packagename packagepath的方式引入,然后通过packagename.MethodName()的形式访问
我们还知道了方法的声明方式:
func funcName(param1 int, param2 string ) string{
}
- funcName 小写开头表示protected,包外不可访问;
- FuncName 大写开头表示public,包外可访问方法
- () 括号内表示方法入参,声明方式是:参数名1 参数类型1,参数名2 参数类型2
- ) 右括符号紧跟方法返回类型。如果不需要返回类型,可不写
- { 左花括号要和方法名同行,否则会报错