Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

My Blog

从此烟雨落金城,一人撑伞两人行。

第四章(上):基本结构

文件名、关键字与标识符

文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,scanner_test.go

有效的标识符必须以字母(可以使用任何 UTF-8 编码的字符或 _)开头。

_ 本身就是一个特殊的标识符,被称为空白标识符。

程序一般由关键字、常量、变量、运算符、类型和函数组成。

程序的基本结构和要素

包、导入与可见性

包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。

每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。

package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

所有的包名都应该使用小写字母。

属于同一个包的源文件必须全部被一起编译,一个包即是编译时的一个单元,因此根据惯例,每个目录都只包含一个包。

每一段代码只会被编译一次

导入包的方式

1
2
3
4
5
6
7
8
9
10
11
import "fmt"
import "os"

import "fmt";import "os"

import (
"fmt"
"os"
)

import ("fmt";"os")

可见性规则

当标识符以一个大写字母开头,就可以被外部包的代码所使用,这被称为导出;标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用。

可以像面向对象语言那样使用点标记来调用:pack1.Thing

函数

1
func functionname()

main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。

函数简短

1
func Sum(a,b int) int {return a+b}

只有当某个函数需要被外部包调用的时候才使用大写字母开头

注释

注释不会被编译,但可以通过 godoc 来使用。

// 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾

每一个包应该有相关注释,在 package 语句之前的块注释将被默认认为是这个包的文档说明。

几乎所有全局作用域的类型、常量、变量、函数和被导出的对象都应该有一个合理的注释。如果这种注释(称为文档注释)出现在函数前面,例如函数 Abcd,则要以 "Abcd..." 作为开头。

1
2
3
4
5
// enterOrbit causes Superman to fly into low Earth orbit, a position
// that presents several possibilities for planet salvation.
func enterOrbit() error {
...
}

类型

类型可以是基本类型,如:int、float、bool、string;结构化的(复合的),如:struct、array、slice、map、channel;只描述类型的行为的,如:interface。

结构化的类型没有真正的值,它使用 nil 作为默认值。Go 语言中不存在类型继承。

函数也可以是一个确定的类型,就是以函数作为返回类型。

一个函数可以拥有多返回值,返回类型之间需要使用逗号分割,并使用小括号 () 将它们括起来,如:

1
func Functionname (a int,b int) (c int,d int)

type 关键字可以定义你自己的类型,你可能想要定义一个结构体,但是也可以定义一个已经存在的类型的别名,如:

1
type IZ int

并不是真正意义上的别名,使用这种方法定义之后的类型可以拥有更多的特性,且在类型转换时必须显式转换。

多个类型定义:

1
2
3
4
5
type (
IZ int
FZ float64
STR string
)

程序的一般结构

  • 在完成包的 import 之后,开始对常量、变量和类型的定义或声明。

  • 如果存在 init 函数的话,则对该函数进行定义。

  • 如果当前包是 main 包,则定义 main 函数。

  • 然后定义其余的函数,首先是类型的方法,接着是按照 main 函数中先后调用的顺序来定义相关函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main
import (
"fmt"
)
const PI = 3.14
var h float32 = 4
type Yuan struct{
r float32
}
func init(){
}
func main(){
y :=&Yuan{9}
Fun(y.mianji() * h)
}
func (y Yuan) mianji() float32{
return PI * y.r * y.r
}
func Fun(v float32){
fmt.Printf("mianji%f",v)
}

类型转换

Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明。

类型 B 的值 = 类型 B(类型 A 的值)

1
2
a := 5.0
b := int(5.0)

评论