笔记篇:基础语法+案例| 青训营
基础语法
框架
- package main代表这个文件属于main包的一部分, main 包是程序的入口包。
- 导入了标准库里面的
fmt
(format)包。这个包主要是用来往屏幕输入输出字符串、格式化字符串。
关键字
类别 | 关键字 | 含义 |
---|---|---|
类、方法和变量修饰符 | chan | 定义一个channel |
interface | 定义接口 | |
func | 函数定义 | |
map | map结构类型 | |
struct | 定义结构体 | |
type | 定义类型 | |
var | 声明变量 | |
const | 声明常量 | |
程序控制 | break | 提前跳出一个块 |
continue | 回到一次循环的开始处 | |
return | 从方法中返回 | |
if | 条件语句的判断 | |
else | 用在条件语句中,表明当条件不成立时的分支 | |
for | 循环 | |
switch | 分支语句结构的引导词 | |
case | 用在switch语句之中,表示其中的一个分支 | |
fallthrough | 如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的值 | |
default | 默认选项,用在switch和select语句 | |
select | go语言特有的channel选择结构 | |
defer | 延迟执行,函数的收尾工作。在函数结束前执行 | |
go | 并发 | |
goto | 跳转语句 | |
range | 从slice、map等结构中取元素 | |
包相关 | import | 表明要访问指定的类或包 |
package | 包 |
数据类型
- go语言是一个门强类型语言,每一个变量都有它自己的变量类型。
- 强类型语言即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。(Python是动态语言,是强类型定义语言)而弱类型语言是一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。(VB,PHP,JavaScript)
- go语言是一个门静态类型语言
- 对于动态语言与静态语言的区分,其根本在于判断是在运行期间去做数据类型还是在编译期间检查。
- 变量的声明
- C:
float array[4], max = 0, min = 0, sum=0
- GO:
var a,b = 100, "abc"
var name string = " "
这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。如果有需要,你也可以显示写出变量类型。- name := value` 只能用在函数内部,不能用在全局变量中。
- C:
- 常量
- 就是把var改成const,值在一提的是go语言里面的常量,它没有确定的类型,会根据使用的上下文来自动确定类型。
- 递增
- Go中没有明确意思上的enum(枚举)定义,不过可以借用iota标识符实现一组自增常量值来实现枚举类型。
分支与循环
C
:
if (expression){ }
else { }
for(表达式1; 表达式2; 表达式3){ 语句块 }
Python
:
if expression: 执行语句
else:执行语句
for <变量> in <循环序列>: 循环体 else: else的语句块
-
Go
:
if expression { }
s
else { }
-
在go里面没有while循环、do while循环,只有唯一的一 种for循环。
-
Go即使是一句代码也需要大括号!!!不同于C/C++
-
switch语句
- 每一个case 语句不加break,默认是执行完立即跳switch,这是与其他语言不同的
- 相比C或者C++,go语言里面的switch功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的if else语句。
- 如果在switch中不加任何变量,可以代替if-else。
switch a{
case 1:***
case 2:***
case 3:***
case 4:***
}
switch{
case t<12:
default:
}
函数
package main
import "fmt"
func add(a int,b int){
return a+b
}
数组
- 不同于c,这里的数组可以直接打印
var arr1 [4]int // 元素自动初始化为零
fmt.Println(arr1) // [0 0 0 0]
arr2 := [4]int{1,2} // 其他未初始化的元素为零
fmt.Println(arr2) // [1 2 0 0]
arr3 := [4]int{5, 3:10} // 可指定索引位置初始化
fmt.Println(arr3) // [5 0 0 10]
切片
- slice的原理实际上是它有一个它存储了 一个长度和一个容量,加一个指向一个数组的指针,在你执行append操作的时候,如果容量不够的话,会扩容并且返回新的slice。
- slice此初始化的时候也可以指定长度。
- slice拥有像python -样的切片操作,比如这个代表取出第二个到第五个位置的元素,不包括第五个元素。不过不同于python, 这里不支持负数索引。
a :=make([]type,n)
var b []int
map
变量名 :=make(map[KeyType]ValueType)
package main
import (
"fmt"
)
func main() {
a := make([]int, 3)
b := []int{1, 5, 'a'}
c := make(map[string]int)
d := map[string]int{"one": 1, "two": 2}
fmt.Println(a, b, c, d)
}
指针
- 功能有限,主要是对值进行修改
结构体
- 结构体方法就是把函数第一个参数提到原本函数前边,然后加上括号。
type user struct {
name string // 字段name 其数据类型为string
age int // 字段age 其数据类型为int
}
接口
- 接口代表一个调用契约,是多个方法声明的集合。若一个struct类实现接口中所有方法,即表示该类实现了指定接口。
- 在并发编程中,接口可以用于定义各种并发模式的接口。比如,在Go语言中,可以定义一个名为WaitGroup的接口,它包含了所有与等待组相关的方法,比如添加等待、等待结束等。然后可以为不同的并发库实现这个接口,以此来实现不同的并发模式。