什么是标识符?
- 说白了,就是你自己定义名称,比如:常量名,函数名,方法名。
- 基本大部分编程语言的规定都是:
字母,数字,下划线
,并且不能以数字开头。 - 而且最好是要区分大小写,比如 name,Name 是不同的。
什么是关键字?
说白了,就是编程语言自身要用的名称,你就不能用它们做名称了。
25个关键字
var // 声明变量 var name string
type // 定义一种数据类型, type Dog struct{} 定义了Dog这种结构体类型
const // 声明常量 const PI = 3.1415926
package // 包声明 package main
import // 导入包 import "fmt"
func // 声明函数, func add(x, y int) int {return x + y}
struct // 声明结构体中使用 type Cat struct{Name string, Cate string}
map // map数据结构 m1 := make(map[int]string, 10)
interface // 接口声明中使用,接口是一种抽象的数据类型 type Animal interface {say()}
if else // 条件语句 weekDay := int(time.Now().Weekday()); if weekDay >= 5 {fmt.Printf("周%d快乐\n", weekDay)} else {fmt.Printf("周%d要上班\n", weekDay)}
switch case default fallthrough // 分支结构相关
weekDay := time.Now().Weekday()
switch weekDay {
case 1
fallthrough
case 2
fallthrough
case 3
fallthrough
case 4
fmt.Println("上班ing")
case 5
fmt.Println("要放假了")
default:
fmt.Println("假期快乐")
}
break // 跳出循环体
continue // 跳过当前循环
return // 中断执行,在函数中表示返回函数的结果到函数的调用处。
goto // 跳到指定位置
range // 循环
slice1 := []string{"a", "b", "c"}
for idx, v := range slice1 {
fmt.Printf("%d=>%v\n", idx, v)
}
for // 循环
for i := 1; i <= 10; i++ {
fmt.Println(i)
}
defer // 延迟执行,在函数确定了返回值之后,执行。
file, err := os.Open("example.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close() // 确保文件在函数结束时被关闭
// chan 声明通道数据类型
ch := make(chan int) // 创建一个int类型的通道
// select 同时处理多个通道的发送和接收,类似于异步监听
// go 启动一个goroutine
37个保留字
true false // 布尔类型的值
iota // 常量自动生成
nil
int int8 int16 int32 int64 intptr // 整型
uint uint8 uint16 uint32 uint64 uintptr //无符号整型
float32 float64 //浮点类型
complex128 complex64 // 复数类型
bool // 布尔类型
byte // 字节类型,是uint8的别名
rune // 字符类型,是int32的别名
string // 字符串类型
error // error类型
make() // 初始化 slice,map
len() // 求 数组,slice,map 的长度
cap() // 求数组,slice,map的容量
new() // 初始化值类型,并返回指针
append() // 追加切片元素
copy() // 复制切片
close() // 关闭通道
delete() // 删除map中指定的键值对
complex() // 创建复数
real() // 获取复数的实部
imag() // 获取复数的虚部
panic() // 触发一个panic错误
recover() // 一般配合panic()使用,类似于try...catch
func test() {
defer func() {
if r := recover(); r != nil {
fmt.Println("恢复了:", r)
}
}
fmt.Println("开始执行")
panic("panic error")
fmt.Println("这行不会被执行")
}
变量是什么?
操作内存中的数据,是依托于内存地址的,但是如果直接在代码中,写地址操作数据,那就太麻烦了,而且还很容易出错。变量可以理解为编译器给地址取的别名。只要你声明了变量,编译器就会给其分配一个地址,没有初始值的话,变量的值就是其类型的零值。
var a int = 1
fmt.Printf("变量a对应的地址:%p\n变量a的值:%d\n", &a, a)
//变量a对应的地址:0xc00000a0c8
//变量a的值:1
为什么需要有变量类型?
其实就是为了内存开销,性能开销,比如存学生的年龄,我用uint8存储,肯定更合适,那就没必要int64了。
还有在运算时,go没有隐式类型转换,相同类型的才能运算,这也是为了减小系统开销。
同时固定了类型,我们的程序也会更健壮。当然,肯定没有php直接赋值来得舒服,go中也考虑到了,所以也有了简短声明 age := 18
,但是要注意,这种简短方式,不能用在全局作用域下。
有哪些数据类型?
整型
浮点
复数
布尔
字符串
数组
切片
map
chan
指针
struct
interface
还可以用 type 自定义类型。
什么是声明变量?
- 其实就是开辟内存空间,得到变量的地址。
- 此时我们还没有给其一个具体的值,所以它的值默认是它类型的零值,整型是0,字符串是””, bool是false,浮点型是0,复杂类型一般都是nil。
声明变量怎么写?
var varname T
var (
varname1 T
varname2 T
varname3, varname4 T // 类型相同,可以一起写
)
作业:声明4个变量:姓名,年龄,金钱,上班没,爱好?
var (
name, love string
age uint8
money float32
isWorking false
)
怎么在同一行,声明多个不同类型的变量?
var name, age = "xqw", 18 // 不要显示给类型了,让go自己去推导
var (
name string
age int
)
什么是变量的初始化?
也就是在声明变量的同时,主动给其一个值(当然你不给,编译器会被动的给)。
怎么写?
var varname T = 值或表达式
var varname = 值或表达式 // 类型会自动推导
varname := 值或表达式 // 简短风格,不能在全局作用域下使用
var (
varname1 T = 值或表达式
varname2 = 值或表达式
)
作业:初始化变量:姓名,年龄,金钱,分数,上班没,爱好?
var name string = "junwind"
money := 100.21
var age, score = 18, 100
var (
isWorking = true
love = "看小说"
)
作业:声明两个变量a,b,并赋值为 “aaa”, 222,然后交换两个变量的值?
a, b := "aaa", 222
a, b = b, a
声明的变量一定非要使用吗?
- 在函数内声明的,一定要使用。
- 函数外,也就是全局作用域下声明的变量可以不使用。
- 对于常量,函数内外声明后,都可以不使用。
什么是匿名变量 _
?
说白了,就是一个占位符,将不要的数据赋值给它,它就像一个数据黑洞,类似 Linux 的 /dev/null
使用它时,它是不会分配内存的。并且不会造成重复赋值的问题。
比如,有一个切片,在遍历时,不需要它的索引值:
for _, v := range []int{1,2,3} {
fmt.Println(v)
}
导入一个包,怎么可以不使用它?
import _ "yourPackage"
其实目的是为了执行包的 init() 函数。
666
加油!!!