特性
- 自动垃圾回收
- 更丰富的内置类型
- 函数多返回值
- 错误处理
- 匿名函数和闭包
- 类型和接口
- 并发编程
- 反射
- 语言交互性
语言结构
- 包声明 (你必须在源文件中非注释的第一行指明这个文件属于哪个包)
- 引入包 ( 告诉 Go 编译器这个程序需要使用包(的函数,或其他元素),比如fmt)
- 函数
- 变量
- 语句 & 表达式
- 注释
package main
import "fmt"
func main() {
/* 这是我的第一个简单的程序 */
fmt.Println("Hello, World!")
}
注意: {
不能单独放在一行,否则会错误
数据类型
- 布尔 【bool】
- 数字 【int【int8,int16,int32,int64,uint8,uint16,uint32,uint64,】,float32,float64,complex64,complex128】
- 字符串 【Go语言的字符串的字节使用UTF-8编码标识Unicode文本。】
- 派生 【指针类型(Pointer),数组类型,结构化类型(struct),Channel 类型,函数类型, 切片类型,接口类型(interface), Map 类型 】
- 其他 【byte(类似uint8),uintptr(无符号整型,用于存放一个指针)】
变量声明
var a int // 使用默认值
var b int = 10
var c = 10
d := 10 // 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。
var x, y int
var e, f = 123, "hello"
var ( // 这种因式分解关键字的写法一般用于声明全局变量
i int
j bool
)
const a, b, c = 1, false, "str" // 常量
// 常量可以用作枚举
const (
Unknown = 0
Female = 1
Male = 2
)
// 常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值
const (
o = "abc"
p = len(o)
q = unsafe.Sizeof(o) // 字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度, ,这两部分每部分都是 8 个字节,所以是16字节
)
func main(){
// 这种不带声明格式的只能在函数体中出现
g, h := 123, "hello"
}
使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。
所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值。
当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i) // 结果 0 1 2 ha ha 100 100 7 8
const (
i=1<<iota
j=3<<iota
k
l
)
// 结果 1 6 12 24