这是我参与「第五届青训营 」伴学笔记创作活动的第1天
基础知识
在Go语言里,命名为main的包具有特殊的含义。Go语言的编译程序会试图把这种名字的包编译为二进制可执行文件。
所有用Go语言编译的可执行程序都必须有一个名叫main的包。一个可执行程序有且仅有一个main包。
语法
注释, 同Java
1.变量
变量,小驼峰命名
定义变量的语法
// 关键字 变量名 类型
var 变量名 type
批定义变量
var (
name string
sex string
)
变量默认值:
整数,浮点数,0,0.0
字符串,""
布尔型,false
切片,函数,指针变量默认为 nil
短变量声明赋值,推导声明
name := "aa"
- 定义的同时初始化
- 不能提供数据类型
- 只能在函数内部
和C一样,有地址,可以格式化输出打印地址%p
值交换
b, a = a, b
匿名变量
匿名变量的特点是一个下画线””,“"本身就是一个特的标识符,被称为空白标识符。它可以像其他标识符那样用变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使下画线替换即可。
在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。
匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
func name() (int, int) {
return 0, 1
}
func main() {
a, _ := name()
}
局部变量,和Java一样
全局变量
必须使用var定义
局部变量可以覆盖全局变量
2.常量
const关键字
常量不能用 := 语法声明。
显式定义
const 名 type = 值
隐式定义
const 名 = 值
多重赋值:
const a, b, c = 1, false, "str"
如果在多重赋值的最后加上类型,即为表示这些变量都为该类型
const d, e, f int = 1,2.0,5
和变量一样,也是可以批量进行声明的。
const (
site = "https://qiucode.cn"
siteName = "秋码记录"
)
如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式,对应的常量类型也是一样的。
const (
a = 1
b
c = 2
d
)
iota
iota在const:关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
技术范围为该常量,在批量声明中会计数,其他的都不会计数
在批量定义中
const (
a = iota//0
b//1
c//2
d = "aa" 在d和e中依旧会计数,在f重新启用后使用启用时的值
e//"aa"
f = iota//5
g//6
)
//都是0
func main() {
const a = iota
const b = iota
const c = iota
}
//这一组也都是0
const d, e, f int = iota, iota, iota
字符串
string
拼接和转义与Java相同
对于\b,起初,我在c primer plus中看到,\b解释为退格,代表backspace,退格键,但经过我的测试,其实这个退格键和键盘上的backspace不一样,并不会删除文本,而是移动光标的位置作用。
同时,只能在本行回退光标位置,不会回到上一行
有类似char的类型,为rune
可以复制字符,或者unicode码值
用于与unicode码交互,直接打印的话,值为int32类型
可以使用格式化输出来打印
不可变
str := "hello"
fmt.Println(len(str))
fmt.Printf("%c", str[0])
数据类型转换
只有显式类型转换
vTypeB = TypeB(vTypeA)
小精度转大没问题,大转小精度丢失
不能转bool和 int
浮点不可以转化为string,int可以
运算符
同Java
不能直接输出a++或a--
算数
关系
逻辑
位
赋值
键盘输入输出
包名
流程控制
func main() {
1
if a == 1 && b == 2{
} else if a != 1 {
} else {
}
2
switch默认case自带break
var score int
switch score {
case 90:
fmt.Println("A")
case 50, 60, 70:
fmt.Println("B")
default:
fmt.Println("D")
}
3
var score int = 90
switch score {
case 90:
fmt.Println("A")
fallthrough//强制执行后面的语句
case 50, 60, 70:
fmt.Println("b")
break
case 80:
fmt.Println("c")
default:
fmt.Println("d")
}
/*结果为
A
b
*/
sum := 0
//初始值;循环条件;变量变化,可以全都不写,即为无限循环
for i := 1; i <= 10; i++ {
sum += i
}
fmt.Println(sum)
break
continue
}
函数
//方法名,参数列表,返回值类型,可以返回多个
func add(a int, b int) int {
return a + b
}
func name() (int, int) {
return 0, 1
}
//可变参数,只能作为最后一个形参出现,且只能有一个
func adds(nums ...int) int {
sum := 0
for i := 0; i < len(nums); i++ {
sum += nums[i]
}
return sum
}
值传递和引用传递
值传递:基本数据类型, array, struct