Go语言基础 | 青训营笔记

437 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第1天

1.1什么是go语言

1. 高性能,高并发
2. 语法简单,学习曲线平缓
3. 丰富的标准库
4. 完善的工具链
5. 静态链接
6. 快速编译
7. 跨平台
  • IOS、Linux、Windows
8. 垃圾回收
  • 引用计数:每个对象维护一个引用计数,当被引用对象被创建或被赋值给其他对象时引用计数自动 +1。如果这个对象被销毁,那么计数-1,当计数为0时,回收该对象。
    • 优点:对象可以很快被回收,不会出现内存耗尽或者达到阈值才回收。
    • 缺点:不能很好的处理循环引用。
  • 标记-清除:从根变量开始遍历所有引用的对象,引用的对象标记“被引用”,没有标记的则进行回收。
    • 优点:解决了引用计数的缺点。
    • 缺点:需要 STW(stop the world),暂时停止程序运行。
  • 分代收集:按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,短的放入新生代,不同代有不同的回收算法和回收频率。
    • 优点:回收性能好
    • 缺点:算法复杂

1.2变量

匿名变量的特点是一个下划线 “_”,它本身就是一个特殊的标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用。

func test() (int, int) {
	return 100, 200
}
func main() {
	a, _ := test()
	_, b := test()
	fmt.Println(a, b) //100 200
}

在编码的过程中,可能会遇到没有名称的变量、类型或者方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量
匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。

1.3 一些变量定义

// :=自动推导

var (
   name string = "wcy"
   age  int    = 21
   addr string = "awe"
)
fmt.Println("Hello,wyq!", name, age, addr)

//Printf 打印数据的类型
fmt.Printf("%T,%T", name, age)

// &age取地址符
fmt.Printf("age:%d,内存地址:%p", age, &age)

1.4 fallthrough

里面的switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。
假设下面给这个方法传入8

switch {
    case false:
        fmt.Println("The integer was <= 4")
        fallthrough
    case true:
        fmt.Println("The integer was <= 5")
        fallthrough
    case false:
        fmt.Println("The integer was <= 6")
        fallthrough
    case true:
        fmt.Println("The integer was <= 7")
        fallthrough                            
    case false:
        fmt.Println("The integer was <= 8")
    default:
        fmt.Println("default case")
    }
// 最后输出结果:              
    The integer was <= 5
    The integer was <= 6
    The integer was <= 7
    The integer was <= 8