第一章 Go语言概述

一 特征

1 语法简单
++ — — 由运算符级降级为语句
go取消了分号, 取消了分号, 取消了末尾分号! 这点和swift一致(可以看出趋向简洁是个趋势)
默认阻止指针运算
(这点和OC不同, 其实Go的两位开发大佬, 有一个是C的创始人, 就是KR中的K, 大佬表示被C的指针快折磨死了)
切片和字典成为内置类型,并做了运行时优化

2 并发模型
Goroutine----类协程的方式处理并发单元**,运行时**用此运行所有的一切,包括main入口函数
我还没有仔细对比过和runtime运行时有什么相同或不同之处.

3 内存分配
tcmalloc 高性能内存分配组件
编译器优化, 竭力将对象分配在栈上,以降低垃圾回收压力,减少管理消耗,提升性能

4 垃圾回收(GC)
并发清理 ---->降低STW(Stop-The-World,除了垃圾回收,停掉其他一切线程) ----> 1.5版本并发标记 ---->三色标记和写屏障

5 标准库
功能完善、质量可靠的标准库为go提供了充足的动力.
如 net/http

7 工具链
工具链非常完整
编译、格式化、错误检查、帮助文档,包括第三方包下载都有对于工具
内置完整测试框架,
单元测试
性能测试
代码覆盖率
数据竞争
性能调优pprof

二 简介

1 源文件
1.1 .go 扩展名
1.2 import引入标准库或第三方库(如果导入的库未使用,则编译报错)

2 变量
2.1 var 定义变量
2.2 支持类型推断
2.3 变量初始化零值
2.4 函数内部可省略var 如 x := 1000

3 表达式
3.1 控制语句
— if语句
— switch语句
— for语句

// For k,v := range data迭代遍历,可返回索引,可遍历字典
for i := 0; i < 4; i++ {
	// C形式循环
}
for x < 100 {
	// 相当于while循环, go中没有while循环
}

4 函数
和OC的方法不同, go中函数可以有多个返回值, 但是参数都是可以有多个
4.1 可定义多返回值,返回值也可命名
4.2 函数本身可作为参数或者返回值
4.3 defer 定义延迟调用,无论函数是否出错,defer都确保结束前被调用,可定义多个defer 按FILO(先进后出)顺序执行
常用来释放资源,解除锁定,或执行一些清理操作

5 数据
5.1 切片(slice) 类似动态数组
创建容量为5个元素的数组,操作时如果超容,则自动分配更大内存

 s := make([]int,5)

5.2 字典
Ok-idiom 模式(多返回值中用一个名为ok的bool值来表示操作是否成功,因为很多操作默认返回零值), ok可知道key/value是否存在, 在OC中, 假如你通过KVC取值, 若key找不到, 则系统会抛异常, 而go这点做的就很好.

 d := make(map[string]int)
        aa, ok := d["b"]

5.3 结构体(struct)

type user struct {
   name string
   sex string
}

结构体中, 可匿名嵌入其他类型

type people struct {
	// 匿名嵌入另一个结构体, user是个struct
   user 
   age int
}

// 结构体嵌套,可实现类似继承的功能
people.name = “hello"
type user struct {
   name string
   sex string
}
type people struct {
   user
   age int
}

6 方法
6.1 可以为当前包内任意类型定义方法
函数名前的参数: receiver接受者,类似self, 是不是很熟悉, OC运行时objc_msgSend()函数调用时, 第一个参数默认的也是self, 同时也是个接受者receiver

// u 就是接受者, 相当于objc_msgSend(id self, ...)中的self
func (u *user) pt()

7 接口
7.1 采用duck type(鸭子类型)方式,即无需在实现类型上添加显式声明
7.2 空接口类型interface{},可以接受任意类型对象
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为

8 并发
有人说go完全为了并发而生
事实上, go的整个运行时都是完全并发设计. 你能看到的任何一切, 都是基于goroutine运行. 官方对goroutine的说法是

这是一种比协程或者线程更加高效的并发设计, 能轻松创建和运行成千上万的并发任务.

而执行方式也符合go的思想, 非常非常的简单, 不像如OC中需要通过GCD等名字很长的调用,
go中只需要 go 任务, 就完成了并发

go task(1)

func task(id int) {
	fmt.Printf("%d", id)
}

go的管道(chanel)和goroutine搭配, 可以实现通过通信代替内存共享的CSP模型

我是个写代码的小学生, 如有不足, 万望不吝指教

参考资料

雨痕 Go学习笔记

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ccccccgu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值