Skip to content

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 包名的另外几个特点:

  1. 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
  2. 文件夹名与包名没有直接关系,并非需要一致。
  3. 同一个文件夹下的文件只能有一个包名,否则编译报错
  4. 跨文件同包名的go文件,可以直接访问其他同包名文件的protected方法
  5. 不同目录下面的go文件,不能声明已有包名。
  6. 不能直接访问其他包内的protected方法,不同包可直接声明相同名字的方法
  7. 引入其他目录下的go文件,通过import packagename packagepath的方式引入,然后通过packagename.MethodName()的形式访问

我们还知道了方法的声明方式:

func funcName(param1 int, param2 string ) string{
}
  1. funcName 小写开头表示protected,包外不可访问;
  2. FuncName 大写开头表示public,包外可访问方法
  3. () 括号内表示方法入参,声明方式是:参数名1 参数类型1,参数名2 参数类型2
  4. ) 右括符号紧跟方法返回类型。如果不需要返回类型,可不写
  5. { 左花括号要和方法名同行,否则会报错

上次更新于: