①. 所有go源码以.go结尾.
②. golang可执行程序,package main有且只有一个main入口函数.
③. 两种注释:单行注释//和多行注释/* */
①. 标识符以字母或下划线开头,大小写敏感
以数字开头、含有特殊符号不行.
②. _是特殊标识符,用来忽略结果
③. 保留关键字
①. import("fmt")
②. import {
"fmt"
}
①. 常量使用const修饰,代表永远是只读的,不能修改.即在编译的时候就已经确定了.
②. const只能修饰boolean、number(int相关类型、浮点类型、complex)和string.
③. 语法:
const identifier [type] = value // 其中type可以省略
④. 举例:
const b string = "hello world"
const b = "hello world" // 不写type在编译时,会自动推导类型
const b = 9/3 // 在编译时,会自动计算值
const c = getValue() // 错误的,因为函数只有在运行时,才会知道返回值
⑤. 比较优雅的写法:
const (
a = 0
b = 1
c = 2
)
⑥. 更加专业的写法:
const (
a = iota // 这个会下面会自动+1
b // 值为1
c // 值为2
)
①. 语法:
var identifier type
②. 举例:
var a int
var d int = 8
Var (
a int // 默认为0
b string // 默认为""
c bool // 默认为false
d int = 8
e = "hello world" // 可以不写type类型
)
①. 值类型:
a. 变量直接存储值,内存通常在栈中分配.
b. 基本数据类型:
int、float、bool、string以及数组和struct
c. var i = 5 // i ---> 内存中的值
②. 引用类型:
a. 变量存储的是一个地址,这个地址存储最终的值.
b. 内存通常在堆上分配,通过GC回收.
c. 传指针效率高,如果传一个很大的结构体,效率就不高了.
d. 引用类型:
指针、slice(切片)、map、chan等都是引用类型.
e. var i = 5 // ref i ---> 地址(指针) ---> 内存中的值
f. &、*的运用:
add(&a)
func add(int *a) {
return *a + 1 // *a表示取这个内存地址对应的值,只是a表示内存地址
}
③. 总结:
a. 在函数体中,如果修改传过来的值类型,外面的值不会变化.因为是复制了一份值进去.如果是修改引用类型,因为指针指向同一个变量,所以会影响外面的值.
(1). 举例:
func main() {
fmt.Println(calc.Age)
a := 10
b := 20
swap(&a, &b);
fmt.Println(a); // 10
fmt.Println(b); // 20
}
func swap(a *int, b *int) { // 这里是交换拷贝值的内存地址,不影响外面
temp := a
a = b
b = temp
fmt.Println("swap a:", *a); // 20
fmt.Println("swap b:", *b); // 10
}
注:
①. 不管值类型是传递值还是内存地址,都是重新拷贝一份.
①. 局部变量:
a. 在函数内部声明的变量.
b. 生命周期仅限于函数内部,出了这个函数,变量就销毁了.
②. 全局变量:
a. 在函数外部声明的变量.
b. 生命周期作用于整个包,如果是大写的,则作用于整个程序.
c. 在语义块{}中,也有作用域.如for循环中声明的变量,不能在for外面使用.