《极客时间TonyBai go语言第一课》学习笔记

文章目录

前置篇

显式

在 C 语言中,下面这段代码可以正常编译并输出正确结果:

c 复制代码
#include <stdio.h>
int main() {
short int a = 5;
int b = 8;
long c = 0;
c = a + b;
printf("%ld\n", c);
}

我们看到在上面这段代码中,变量 a、b 和 c 的类型均不相同,C 语言编译器在编译c =

a + b这一行时,会自动将短整型变量 a 和整型变量 b,先转换为 long 类型然后相加,

并将所得结果存储在 long 类型变量 c 中。那如果换成 Go 来实现这个计算会怎么样呢?我

们先把上面的 C 程序转化成等价的 Go 代码:

go 复制代码
package main
import "fmt"
func main() {
var a int16 = 5
var b int = 8
var c int64
c = a + b
fmt.Printf("%d\n", c)
}

如果我们编译这段程序,将得到类似这样的编译器错误:"invalid operation: a + b

(mismatched types int16 and int)"。我们能看到 Go 与 C 语言的隐式自动类型转换不

同,Go 不允许不同类型的整型变量进行混合计算,它同样也不会对其进行隐式的自动转

换。

因此,如果要使这段代码通过编译,我们就需要对变量 a 和 b 进行显式转型,就像下面代

码段中这样:

go 复制代码
c = int64(a) + int64(b)
fmt.Printf("%d\n", c)

在 Go 语言中,不同类型变量是不能在一起进行混合计算的,这是因为 Go 希望开发人员

明确知道自己在做什么,这与 C 语言的"信任程序员"原则完全不同,因此你需要以显式

的方式通过转型统一参与计算各个变量的类型。

除此之外,Go 设计者所崇尚的显式哲学还直接决定了 Go 语言错误处理的形态:Go 语言

采用了显式的基于值比较的错误处理方案,函数 / 方法中的错误都会通过 return 语句显式

地返回,并且通常调用者不能忽略对返回的错误的处理

组合

Go 语言为支撑组合的设计提供了类型嵌入(Type Embedding)。通过类型嵌入,我们可

以将已经实现的功能嵌入到新类型中,以快速满足新类型的功能需求,这种方式有些类似

经典面向对象语言中的"继承"机制,但在原理上却与面向对象中的继承完全不同,这是

一种 Go 设计者们精心设计的"语法糖"。

go 复制代码
// $GOROOT/src/sync/pool.go
type poolLocal struct {
private interface{}
shared []interface{}
Mutex
pad [128]byte
}

在代码段中,我们在 poolLocal 这个结构体类型中嵌入了类型 Mutex,这就使得

poolLocal 这个类型具有了互斥同步的能力,我们可以通过 poolLocal 类型的变量,直接

调用 Mutex 类型的方法 Lock 或 Unlock。

interface:

go 复制代码
type Book struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

func NewBook() *Book {
	return &Book{}
}

// 接口类型
type Store interface {
	GetBook(ctx context.Context, id string) (*Book, error)
}

func (s *Book) GetBook(id int) (*Book, error) {
	return nil, nil
}

func test() {
	NewBook().GetBook(1)
}

并发

并发"这个设计哲学的出现有它的背景,你也知道 CPU 都是靠提高主频来改进性能的,

但是现在这个做法已经遇到了瓶颈。主频提高导致 CPU 的功耗和发热量剧增,反过来制约

了 CPU 性能的进一步提高。2007 年开始,处理器厂商的竞争焦点从主频转向了多核。

在这种大背景下,Go 的设计者在决定去创建一门新语言的时候,果断将面向多核、原生支

持并发作为了新语言的设计原则之一。并且,Go 放弃了传统的基于操作系统线程的并发模

型,而采用了用户层轻量级线程,Go 将之称为 goroutine。

goroutine 占用的资源非常小,Go 运行时默认为每个 goroutine 分配的栈空间仅 2KB。

goroutine 调度的切换也不用陷入(trap)操作系统内核层完成,代价很低。因此,一个

Go 程序中可以创建成千上万个并发的 goroutine。而且,所有的 Go 代码都在 goroutine

中执行,哪怕是 go 运行时的代码也不例外。

在提供了开销较低的 goroutine 的同时,Go 还在语言层面内置了辅助并发设计的原语:

channel 和 select。开发者可以通过语言内置的 channel 传递消息或实现同步,并通过

select 实现多路 channel 的并发控制。相较于传统复杂的线程并发模型,Go 对并发的原

生支持将大大降低开发人员在开发并发程序时的心智负担。

入门篇

Go 包的初始化次序

参考图书管理项目:https://github.com/bigwhite/publication/tree/master/column/timegeek/go-first-course/09/bookstore

镜像链接:https://bgithub.xyz/bigwhite/publication/tree/master/column/timegeek/go-first-course

github镜像网站:https://blog.csdn.net/wtt234/article/details/135815704

初始化一个项目

shell 复制代码
$mkdir simple-http-server
$cd simple-http-server
$go mod init simple-http-server

todo 有空研究下goframe的启动流程

大纲

相关推荐
LuH11248 分钟前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
兔C13 分钟前
微信小程序的轮播图学习报告
学习·微信小程序·小程序
海海不掉头发20 分钟前
苍穹外卖-day05redis 缓存的学习
学习·缓存
小木_.1 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器
一棵开花的树,枝芽无限靠近你1 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
犬余2 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
啊瞑3 小时前
学习记录:配置mybatisplus的分页查询插件,mybatis-plus-jsqlparser 依赖
学习
码到成龚3 小时前
SQL server学习09-数据库编程(上)
数据库·学习
数据爬坡ing3 小时前
小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
大数据·笔记·考研·数据分析
咖肥猫3 小时前
【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?
笔记·学习·ue5