学习书籍 : Go程序设计语言

命名

命名与java c/c++等语言命名基本一一致,

  • 区分大小写
  • 名称的开头只能是字母(Unicode中的字符即可)或下划线

比如heapSortHeapsort是不同的名称。

Go的关键字

关键字不能作为变量名

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

Go还有内置的预生命的 常量 , 类型以及函数

常量

true false iota nil

nil与 java 中的null意义相同

类型

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

这些名称不是预留的,可以在声明中使用它们。我们将在很多地方看到对其中的名称进行重声明,但是要知道这有冲突的风险

如果一个实体在函数中声明,它只在函数局部有效。如果声明在函数外,它将对包里面的所有源文件可见。

==实体第一个字母的大小写决定其可见性是否跨包。==如果名称以==大写字母==的开头,它是==导出==的,意味着它对包外是可见和可访问的,可以被自己包之外的其他程序所引用,像fmt包中的Printf.

包名本身总是由小写字母组成。

Go的命名风格上通常使用 驼峰式 的风格,

这一点就跟java差不多

不过需要注意的是 像ASCIⅡ和HTML这样的首字母缩写词通常使用相同的大小写

所以一个函数可以叫作htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtmlo

声明

Go有4个主要的声明:变量( var)、常量(const)、类型(type)和函数(func)。

下面的程序声明一个常量、一个函数和一对变量:

1
2
3
4
5
6
7
8
9
10
package main
import "fmt"
cosnt bopilingF = 212.0
func main(){
var f= boilingF
var c=(f-32) *5/9
fmt.Println("boiling point = %g °F or %g °C \n",f,c)
//输出:
//boi1 ing point=212°For100°C
}

常量boilingF是一个包级别的声明(main包),f和c是属于main函数的局部变量。

包级别的实体名字不仅对于包含其声明的源文件可见,而且对于同一个包里面的所有源文件都可见。

另一方面,局部声明仅仅是在声明所在的函数内部可见,并且可能对于函数中的一小块区域可见。

变量

ar声明创建一个具体类型的变量,然后给它附加一个名字,设置它的初始值。每一个声明有一个通用的形式:

var name type= expression

类型和表达式部分可以省略一个,但是不能都省略。

  • 如果类型省略,它的类型将由初始化表达式决定

  • 如果表达式省略,其初始值对应于类型的零值一对于数字是0 ,对于布尔值是false,对于字符串是 “” ,

    对于接口和引用类型(slice、指针、map、通道、函数)是ni1。对于一个像数组或结构体这样的复合类型,零值是其所有元素或成员的零值。

零值机制保障所有的变量是良好定义的,G0里面不存在未初始化变量。这种机制简化了代码,并且不需要额外工作就能感知边界条件的行为。例如:

1
2
var s string
fmt.Println(s)// ""

可以声明一个变量列表,并选择使用对应的表达式列表对其初始化。忽略类型允许声明多个不同类型的变量。

1
2
var i,j,k int //int,int,int
var b,f,s true,2.3,"four"//bool,float64,string

初始值设定可以是字面量值或者任意的表达式。包级别的初始化在main开始之前进行,局部变量初始化和声明一样在函数执行期间进行。

var f ,err= os.Open(name) os.0pen返回一个文件和一个错误

短变量声明

在函数中,一种称作短变量声明的可选形式可以用来声明和初始化局部变量。它使用name:=expression的形式,name的类型由expression的类型决定。

比如

1
2
3
anim:= gif.GIF{LoopCount :nframes}
freq:=rand.Float64() * 3.0
t:=0.0

因其短小、灵活,故而在局部变量的声明和初始化中主要使用短声明

var声明通常是为那些跟初始化表达式类型不一致的局部变量保留的,或者用于后面才对变量赋值以及变量初始值不重要的情况

1
2
3
4
5
i :=100 // 一个 int 类型的变量
var boiling float64= 100// 一个float64类型的变量
var names[]string
var err error
var p Point

与var声明一样,多个变量可以以短变量声明的方式声明和初始化:
i,j:=0,1

等价于var i,j=0,1

记住,:=表示声明,而=表示赋值。

一个多变量的声明不能和多重赋值搞混,后者将右边的值赋给左边的对应变量: