016-Go 程序结构

欢迎进入新的章节!

为了能够深入 go 语言的各个细节,我们需要掌握一些基本概念和 go 的相关术语。

本文程序路径是 gopl/programstructure/decltestgopl/programstructure/declarations

运行方法:

$ cd gopl/programstructure/decltest
$ go run main.go

1. go 语言程序结构

先来看一个简单的示例:

package calc // 包声明,指示当前 go 文件属于哪个包;一个 go 文件必须要声明它属于哪个包

import "fmt" // 导入依赖包。

var five int = 5 // 包级名字:声明一个变量

// 包级名字:声明函数
func AddFive(a int) int {
    var b int // 函数内部声明,只能在函数内部使用
    b = a + five
    fmt.Printf("%d + 5 = %d\n", a, b)
    return b
}

上面的例子虽然短小,但是却是一个完整的 go 程序。总的来说,go 文件分成了三大部分:

  • 包声明语句:必须的
  • import 导入依赖需要包:只要使用到了某个包,就需要使用 import 语句导入。如果没有用到任何包,意味着 import 语句一行也没有。(在 go 里,如果一个 import 的包没有被使用,编译会报错。go 就是这么任性。)
  • 包级名字声明,定义在函数外面。

以上面的程序为例,它的包声明是 package calc;导入依赖只有一行 import "fmt";有两种包声明类型,分别是 var five int = 5 和一个 func 声明。

关于类型声明和常量声明在上面的程序里没有出现,但是在第一章你肯定见过常量声明。

2. 程序实体和名字

在 go 中,变量,常量,类型(包含结构体和接口)和函数,称为程序实体。这些程序实体的名字称为标识符

在 go 里,标识符的名字只能以字母或下划线开头,后面跟上任意数量的字母数字或下划线

标识符的名字不能占用 go 定义的关键字。go 的关键字目前有 25 个。

break     | case   | chan    | const       | continue

default   | defer  | else    | fallthrough | for

func      | go     | goto    | if          | import

interface | map    | package | range       | return

select    | struct | switch  | type        | var

3. 包级名字

包级名字,声明在函数外的名字。包级函数也是包级名字。

包级名字如果以大写字母开头,称之为导出的名字,可以以包外部使用它。否则就只能在包内部使用。(中文名字算是大写还是小写开头?留做作业!请不要百度 or 谷歌!)

前面我们使用过了很多导出名字,比如 fmt 包的 Printf.

4. 声明

在 go 中,有 4 种声明,分别是 var, const, type, func。在第一章中,我们已经使用过了其中的三种,只有 type 还没有使用过。

  • var 声明

声明变量。

由关键字var、变量名称、变量类型、特殊标记=,以及相应的值组成。如:

var five int = 5

你也可以不写 = 5 这两部分,即:

var five int

下面的声明也是可以的,称为平行赋值(或元组赋值):

var four, five int = 4, 5

也可以这样,称为多行赋值:

var (
    four int = 4
    five int = 5
)
  • const 声明

这里先略过,后面会详细解释

  • type 声明

type 用于创建一个新的类型名称,非常像 c 语言的 typedef 关键字。使用方法:

type 新的类型名字 底层类型名字

比如:

type Second int64

以后就可以这样使用: var x Second

type 也用于声明复合结构和接口。比如:

// 复合结构声明
type Person struct {
    name string
    age int
}

接口声明,比如:

// 接口声明
type Writer interface {
    Write(p []byte) (n int, err error)
}
  • 函数声明

函数声明由下面几个部分组成(用):

func [函数名字]([参数列表]) ([返回值列表]) {
    [函数体]
}

在 go 语言里,函数可以没有名字,称为匿名函数。参数列表和返回值列表都是可选的。在 go 中,返回值是可以有多个的,前面我已经遇到过很多次了。比如我声明一个返回 2 个值的函数:

func hello() (int, int) {
    return 1, 2
}

关于函数,后续还会详细介绍。

5. 总结

  • go 程序结构(三部分)
  • 程序实体
  • 关键字(25个)
  • 标识符名字
  • 包级名字,导出名字
  • 4 种声明

练习:

  1. 请对照上面的知识点,回忆本篇内容。
  2. 包级名字里,中文名字是否是导出的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值