Golang 第二章 1.2.命名和声明

  • By v2ray节点

  • 2024-07-04 10:53:08

  • 评论

在 Go 语言中,与其他编程语言一样,大型程序是由一小部分基本构造组成的。变量用于存储值。简单表达式通过加法和减法等运算组合成更大的表达式。基本类型被集合成数组和结构体等聚合类型。表达式用于语句中,其执行顺序由 if 和 for 等控制流语句决定。语句被组合成函数,以便隔离和重用。函数被组织到源文件和包中。

在上一章中,我们看到了这些大部分的例子。在本章中,我们将更详细地讨论 Go 程序的基本结构元素。示例程序故意设计得简单,以便我们可以专注于语言本身,而不会被复杂的算法或数据结构分散注意力。


名字

Go 语言中的函数、变量、常量、类型、语句标签和包的命名遵循一个简单的规则:名称以字母(即 Unicode 认定的字母)或下划线开头,可以包含任意数量的其他字母、数字和下划线。区分大小写:heapSort 和 Heapsort 是不同的名称。

Go 有 25 个关键字,如 if 和 switch,它们只能在语法允许的地方使用,不能用作名称。

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimport27returnvar

此外,还有大约三十多个预声明名称,如 int 和 true,用于内置常量、类型和函数:

常量: true false iota nil

类型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error

功能: make len cap new append copy close delete complex real imag panic recover

这些名称不是保留字,因此你可以在声明中使用它们。在某些情况下重新声明其中的一些名称是合理的,但要注意潜在的混淆。

如果一个实体在函数内声明,那么它是该函数的局部变量。然而,如果在函数外声明,它在所属包的所有文件中都是可见的。名称首字母的大小写决定了它在包之间的可见性。如果名称以大写字母开头,则表示它是导出的,这意味着它在其自身包外也是可见和可访问的,并且可以被程序的其他部分引用,如 fmt 包中的 Printf。包名本身总是小写的。

名称的长度没有限制,但 Go 程序的惯例和风格倾向于使用简短的名称,特别是对于作用范围较小的局部变量;你更可能看到名为 i 的变量,而不是 theLoopIndex。通常,名称的作用范围越大,其名称就应该越长且越有意义。

在风格上,Go 程序员在组合单词时使用“驼峰命名法”;即,倾向于在单词内部使用大写字母而不是下划线。因此,标准库中有像 QuoteRuneToASCII 和 parseRequestLine 这样的函数名称,但不会有 quote_rune_to_ASCII 或 parse_request_line。首字母缩略词和首字母缩略词(如 ASCII 和 HTML)的字母总是以相同的大小写呈现,所以一个函数可能被称为 htmlEscape、HTMLEscape 或 escapeHTML,但不会叫 escapeHtml。


声明

声明命名程序实体并指定其部分或全部属性。声明主要有四种类型:var、const、type 和 func。我们将在本章中讨论变量和类型,在第三 章中讨论常量,在第五章中讨论函数。

Go 程序存储在一个或多个以 .go 结尾的文件中。每个文件都以包声明开头,说明该文件属于哪个包。包声明后跟任意导入声明,然后是包级类型、变量、常量和函数的声明序列,顺序不限。例如,此程序声明了一个常量、一个函数和几个变量:

https://gopl.io/ch2/boiling
//打印出水的沸点。
package main

import "fmt"

const boilingF = 212.0

func main() {
	var f = boilingF
	var c = (f - 32) * 5 / 9
	fmt.Printf("boiling point = %g°F or %g°C\n", f, c)
	// Output:
	// boiling point = 212°F or 100°C
}

常量 boilingF 是一个包级别的声明(main 也是如此),而变量 f 和 c 则是 main 函数的局部变量。每个包级别实体的名称不仅在包含其声明的源文件中可见,而且在整个包的所有文件中都可见。相比之下,局部声明只在其声明所在的函数内可见,甚至可能只在函数的一小部分内可见。

函数声明包含一个名称、一个参数列表(由函数调用者提供值的变量)、一个可选的结果列表,以及定义函数执行内容的函数体。如果函数不返回任何值,则结果列表可以省略。函数的执行从第一个语句开始,继续执行直到遇到 return 语句或到达不返回结果的函数末尾。然后控制权和任何结果会返回给调用者。

我们已经见过相当多的函数,后面还会看到更多,包括在第五章中的详尽讨论,所以这里只是一个概述。下面的 fToC 函数封装了温度转换的逻辑,使其只定义一次但可以从多个地方使用。在此,main 函数调用它两次,使用两个不同的局部常量值:

gopl.io/ch2/ftoc
//打印两个华氏度到摄氏度的转换。
package main

import "fmt"

func main() {
	const freezingF, boilingF = 32.0, 212.0
	fmt.Printf("%g°F = %g°C\n", freezingF, fToC(freezingF)) // "32°F = 0°C"
	fmt.Printf("%g°F = %g°C\n", boilingF, fToC(boilingF))   // "212°F = 100°C"
}
func fToC(f float64) float64 {
	return (f - 32) * 5 / 9
}


v2ray节点购买