Go基础笔记

Go语言学习笔记。

语法和特性

  • main包比较特殊。它定义了一个独立可执行的程序,而不是一个库。
  • 编译器会主动把特定符号后的换行符转换为分号, 因此换行符添加的位置会影响Go代码的正确解析.

作用域

名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的,那么它将是导出的,也就是说可以被外部的包访问。

通常来说,如果一个名字的作用域比较大,生命周期也比较长,那么用长的名字将会更有意义。推荐使用 驼峰式 命名。

声明和赋值

  • 变量会在声明时直接初始化
  • 符号:=是短变量声明(short variable declaration)的一部分, 这是定义一个或多个变量并根据它们的初始值为这些变量赋予适当类型的语句.
  • 通常在函数内部使用.请记住“:=”是一个变量声明语句,而“=”是一个变量赋值操作
  • 自增和自减是语句,而不是表达式

逻辑结构

  • 习惯在if中处理错误然后直接返回,这样可以确保正常执行的语句不需要代码缩进。
  • 不要将一个控制结构if、for、switch、select的左大括号放在下一行
  • switch 不需要显式地在每一个case后写break
  • switch还可以不带操作对象, tagless switch(注:switch不带操作对象时默认用true值代替,然后将每个case的表达式和true值进行比较)
  • break会中断当前的循环,并开始执行循环之后的内容
  • continue会跳过当前循环,并开始执行下一次循环。

类型

Go语言将数据类型分为四类:

  • 基础类型: 数字、字符串和布尔型
  • 复合类型: 数组和结构体
  • 引用类型: 指针、切片、字典、函数、通道
  • 接口类型:

对于每种类型T,如果转换允许的话,类型转换操作T(x)将x转换为T类型

&&对应逻辑乘法,||对应逻辑加法,乘法比加法优先级要高

指针

指针是可见的内存地址,&操作符可以返回一个变量的内存地址,并且*操作符可以获取指针指向的变量内容

一个指针的值是另一个变量的地址

  • &x表达式(取x变量的内存地址),指针对应的数据类型是*int,指针被称之为“指向int类型的指针”
  • *p表达式对应p指针指向的变量的值,变量有时候被称为可寻址的值

new只是一个预定义的函数

  • 在现实的程序里,一般会约定如果Point这个类有一个指针作为接收器的方法,那么所有Point的方法都必须有一个指针接收器。
  • 只有类型(Point)和指向他们的指针(*Point),才可能是出现在接收器声明里的两种接收器
  • 不管你的method的receiver是指针类型还是非指针类型,都是可以通过指针/非指针类型进行调用的,编译器会帮你做类型转换。
  • 在声明一个method的receiver该是指针还是非指针类型时,你需要考虑两方面的因素,第一方面是这个对象本身是不是特别大,如果声明为非指针变量时,调用会产生一次拷贝;第二方面是如果你用指针类型作为receiver,那么你一定要注意,这种指针类型指向的始终是一块内存地址,就算你对其进行了拷贝。

模块

init()函数总是被执行,一个package的多个init()都会被执行

//函数返回不定数量参数
func multiArgs(a ...interface{}){
    fmt.Println(a...)
}