命名和声明

* 本页面主要介绍Go语言命名和声明的相关内容。

一、命名

Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大小写字母是敏感的。

下面25个内置关键字和37个预定义的名字是不可以用于自定义名字的。预定义和关键字的区别在于,预定义的名字你是可以在定义中重新使用他们的,但是尽量少用避免造成歧义。

              
break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var
            
              
内建常量: 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
            

对于名字,还有以下特点需要注意:

  • 名字的作用域范围,可以参考 1.6 代码块和作用域 的内容
  • 大写字母开头决定它的可导出性
  • 包本身的名字一般总是用小写字母
  • 名字的长度没有逻辑限制,但是Go语言的风格是尽量使用短小的名字,对于局部变量尤其是这样。一般的,名字越短,作用域越小,反之则越大
  • 习惯上,Go语言程序员推荐使用 驼峰式 命名
  • 像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml
二、声明

声明语句定义了程序的各种实体对象以及部分或全部的属性。当一个变量被声明之后,系统自动赋予它该类型的零值(如bool的零值是false, 整数的零值是0等)。Go语言主要有四种类型的声明语句:

  • var:变量的声明
  • const:常量的声明
  • type:结构体的声明
  • func:函数的声明

我们用下面的代码感受下各种“声明”的使用。

              
  // Boiling prints the boiling point of water.
  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
  }
            

对于上面示例代码中的“声明”,解析如下:

  • package 包的声明语句,说明该 1.7 源文件 属于哪个包
  • 然后是包级别的变量、常量和函数的声明语句,它们之间的顺序无关紧要
  • boilingF这个常量是包级别的作用域,而变量f和c则是函数级别的作用域
  • 函数的声明由一个函数名字、参数列表(由函数的调用者提供参数变量的具体值)、一个可选的返回值列表和包含函数定义的函数体组成。无需返回值的函数,返回值列表可以省略
变量声明的方式的“语法糖”

上面我们讲到的变量声明语句是var name string。但还有一种便利方式是:短变量声明。

 name := "zhengkai"

这里利用了 Go 语言自身的类型推断,而省去了对该变量的类型的声明。简单地说,类型推断是一种编程语言在编译期自动解释表达式类型的能力。Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。

常见的声明举例:
              
  //基础类型
  var a int | var a , b string |  var c byte | var d bool | 
 a := 10 | b := "123456" | c := 'a' | d := true

  //数组
  var array [10]int
  q := [...]int{1, 2, 3}

  //切片
  var name []Type
  a := []int{1, 2, 3}
  make([]Type, size, cap) 

  //map
  var mapList map[int]string
  mapList := map[int]string{1:"a", 2:"b"} 
  mapList := make(map[int]string)

  //sync.Map 引入包后直接声明
  import "sync"
  var scene sync.Map

  //list
  import "container/list"
  var listA list.List
  listA := list.New()

  //chan
  var chanA = chan int 
  chanA := make(chan int)
  chanA = make(chan int)

            

最后,关于声明和初始化,有些地方需要特殊强调一下:

make一定发生了内存分配。map直接声明后不能直接操作,下标因为此时变量指向空指针,需要make之后才能操作。通道是引用类型,声明后值为nil,所以也需要make后才可使用。

好了,关于命名和声明相关的知识点就整理到这里,接下来继续学习 变量 吧!


* 本页内容参考以下数据源:

  • 《Go程序设计语言》2.1 2.2
  • 《Go编程语言核心36讲》 4程序实体的那些事儿(上)
  • https://www.cnblogs.com/zz8781/p/12916886.html

凯冰科技 · 代码改变世界,技术改变生活
Next Page→