go-基础知识

go 基础知识介绍

名称

  1. 实体第一个字母的大小写决定其可见性是否跨包。如果名称以大写字母开头,以为着它可以被其他包引入并访问。
  2. 包名总是有小写字母组成
  3. 驼峰式命名

变量声明及初始化

1
2
3
4
s := "" // 短变量声明
var s string
var s = ""
var s string = ""

第一种形式通常在一个函数内部使用,不适合包级别的变量
第二种形式依赖默认初始化为空字符串的””
第三种形式很少用,除非我们声明多个变量
第四种形式是显式的变量类型,在类型一致的情况下是冗余的信息,在类型不一致的情况下是必须的。
实践中,我们通常使用前两种形式。

注意:第一种形式不需要声明所有在左边的变量, 如:

1
2
3
in, err := os.Open(infile)
//...
out, err := os.Create(outfile)

第一条语句声明了in和err。第二条语句仅声明了out,但向已有的err变量赋了值

短变量声明最少声明一个新变量,否则,代码编译将无法通过:

1
2
3
f, err := os.Open(infile)
//...
f, err := os.Create(outfile) // 编译错误:没有新的变量

声明

主要有4个声明:变量(var)、常量(const)、类型(type) 和 函数(func)
Go程序存储在一个或多个以.go为后缀的文件里。每一个文件已package声明开头,表明文件属于哪个包。package声明后,接着是import声明,然后是包级别的类型、变量、常量、函数的声明,不区分顺序,eg:

1
2
3
4
5
6
7
8
9
10
11
package main
import "fmt"
const boilingF = 212.0
func main() {
var f = boilingF
var c = (f - 32) * 5 / 9
fmt.Printf("boiling point = %g or %g", f, c)
}

指针

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

1
2
3
4
5
x := 1
p := &x // p 是整型指针,指向x
fmt.Println(*p) // "1"
*p = 2 // 等于 x = 2
fmt.Println(x) // 结果 "2"

如果声明var x int, 表达式&x(x的地址)获取一个指向整型变量的指针,它的类型是整型指针(int)。如果值叫做p,我们说p指向x,或者p包含x的地址。p指向的变量写成p

作用域

1
2
3
4
5
6
7
8
if x :=f(); x == 0 {
fmt.Println(x)
} else if y := g(x); x == y {
fmt.Println(x, y)
} else {
fmt.Println(x, y)
}
fmt.Println(x, y) // 编译错误: x 与 y 在这里不可见

第二个if语句嵌套在第一个语句中,所有第一个if语句的初始化部分 声明的变量在第二个语句中使可见的。同样的规则可以应用于switch语句

数据类型

主要数据类型分为四大类:基础类型、引用类型、结构类型

基础类型

数值类型、字符串类型、布尔类型

引用类型

引用类型包括:slice、map、通道、接口和函数

结构类型

通过struct定义

总结

  • 每个代码文件都属于一个包,而包名应该与代码文件所在的文件夹同名
  • Go语言提供了多种声明和初始化变量的方式。如果变量的值没有显式初始化,编译器会将变量初始化为零值
  • 使用指针可以在函数建或者goroutine间共享数据
  • 通过启动goroutine和使用通道完成并发和同步