ARTS 第11周分享
[TOC]
Algorithm
发现自己的算法能力太差了,打算从最基础的数据结构学习算法,将自己的基础给打扎实,
实现一个单项循环队列
[思路]
- 一个队列包含有前节点,指向第一个元素;尾节点,指向最后一个元素;最大尺寸,记录能够存储的最大元素数量;以及一个数组用来存储实际的数据(在golang中更适合用slice实现)
- 初始头和尾指针都指向下标为0的元素
- 通过预留一个空位来区别空队列与满队列,否则将很难区分二者
- 空:rear = front
- 满:(rear+1+ maxSize - front)% maxSize == 0
[参考代码]
type singleCircleArray struct {
maxSize int
front int
rear int
myArray []int
}
func (s *singleCircleArray) addItem(item int) (err error) {
if s.isFull() {
fmt.Print("full Array/t")
return errors.New("full Array")
}
s.myArray[s.rear] = item
fmt.Println("addItem: ", s.myArray)
s.rear = (s.rear + 1) % s.maxSize
return
}
func (s *singleCircleArray) isFull() bool {
return (s.rear+1-s.front+s.maxSize)%s.maxSize == 0
}
func (s *singleCircleArray) isNull() bool {
return s.rear == s.front
}
func (s *singleCircleArray) getItem() (item int, err error) {
if s.isNull() {
return 0, errors.New("empty Array")
}
item = s.myArray[s.front]
s.myArray[s.front] = 0
s.front = (s.front + 1) % s.maxSize
return
}
func (s *singleCircleArray) head() (item int, err error) {
if s.isNull() {
return 0, errors.New("empty Array")
}
fmt.Println(s.myArray[s.front])
return s.myArray[s.front], err
}
func (s *singleCircleArray) list() {
if s.isNull() {
fmt.Println("empty Array")
return
}
temp := s.front
for {
fmt.Printf("%d\t", s.myArray[temp])
temp = (temp + 1) % s.maxSize
if s.rear == temp {
break
}
}
}
Review
- golang里的pointer: https://golangbot.com/pointers/
- 指针是一个变量,存储的是变量的地址
- 通过 *T 声明一个指针
- 指针的零值是nil
- 通过new()函数初始化一个指针
- 通过 &t 来获取一个指针指向的值
- 在函数的参数上,不要将声明为一个数组的指针;如果需要修改数组,可以函数的参数定义为一个切片,通过将Array[:]作为参数传递
- golang指针不支持运算
Tips
git diff 的常用用法
-
git diff
- 什么都不加就是对比: 工作区与暂存区
-
git diff --cached
- 暂存区与最新的本地版本库(本地最新一次commit的内容)
-
git diff head
- 工作区 与 最新的本地版本库
-
git diff + 指定版本id(commit_id)
- 工作区 与 指定的提交版本
-
git diff --cached + 指定版本id(commit_id)
- 暂存区与 指定的提交版本
-
git diif commit_id commit_id
- 比较两个版本之间的差异
share
Go语言实战笔记(十八)| Go log 日志: https://www.flysnow.org/2017/05/06/go-in-action-go-log.html
golang 提供了log包,来追踪日志的记录
- 与fmt包很相似,但是输出默认带时间戳
log包提供了可定制化的日志抬头信息
通过log.SetFlags 进行设置
可定义的常量选项
const (
Ldate = 1 << iota //日期示例: 2009/01/23
Ltime //时间示例: 01:23:23
Lmicroseconds //毫秒示例: 01:23:23.123123.
Llongfile //绝对路径和行号: /a/b/c/d.go:23
Lshortfile //文件和行号: d.go:23.
LUTC //日期时间转为0时区的
LstdFlags = Ldate | Ltime //Go提供的标准抬头信息
)
- 设置了Lmicroseconds,那么Ltime就不生效了;设置了Lshortfile, Llongfile也不会生效
- LUTC比较特殊,如果我们配置了时间标签,那么如果设置了LUTC的话,就会把输出的日期时间转为0时区的日期时间显示。对我们东八区的时间来说,就会减去8个小时。
- LstdFlags表示标准的日志抬头信息,也就是默认的,包含日期和具体时间。(也就是不用设置,就是这个格式)
通过log.SetPrefix可以指定输出日志的前缀
在log包除了有Print系列的函数,还有Fatal以及Panic系列的函数。
- Fatal表示程序遇到了致命的错误,记录完日志然后退出。Fatal相当于先调用print打印日志,然后调用os.Exit(1) 退出程序。
- Panic函数先使用Print记录日志,然后调用Panic() 抛出一个恐慌(可以选择性的用recover() 恢复程序)
实现原理: 关键的输出日志就在于std.Output方法。
输出目的地:
- os.Stderr对应的是UNIX里的标准错误警告信息的输出设备,同时被作为默认的日志输出目的地。除此之外,还有标准输出设备os.Stdout,以及标准输入设备os.Stdin。
- var ( Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout") Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr") )
- 以上就是定义的UNIX的标准的三种设备,分别用于输入、输出和警告错误信息。
在log包的SetOutput函数,可以设置输出目的地。
通过runtime.Caller,可以获取运行时方法的调用信息
- func Caller(skip int) (pc uintptr, file string, line int, ok bool)
- 参数skip表示跳过栈帧数,0表示不跳过,也就是runtime.Caller的调用者。1的话就是再向上一层,表示调用者的调用者。
- log日志包里使用的是2,也就是表示我们在源代码中调用log.Print、log.Fatal和log.Panic这些函数的调用者。
第二周:1, 2, 3, 4, 5, 6, 7
为什么计算机只认识0和1?https://mp.weixin.qq.com/s/9ePjft6QleS8pRz9AoXlmA
罗胖60秒:什么是最好的时间管理?https://mp.weixin.qq.com/s/o7fn1-ITovRHMyGUcWohoA
沉浸在你尊重的事儿里面,比如读书,健身, 学习。
Go2错误处理提案:try还是check?https://mp.weixin.qq.com/s/fpTM4zXCmGe2c03LhNbFRw
时区的关系:https://mp.weixin.qq.com/s/sgtPyXJxs5-Rh5OorFz8bw
由于地球自转,导致不同经度的地方时间有不同,即东边比西边早看到太阳
时区:地球表面按经度:自东向西划成一个个区域,并且规定每个区域相差一个小时
跨时区时,向东加1小时,向西减1小时
中国时间:GMT + 8 (也就是所谓的东八区)
GMT: Greenwich Mean Time 格林威治时间,英国xxx天文台平太阳时间为0点
罗胖60秒:为什么“目的性强”的人招人讨厌?https://mp.weixin.qq.com/s/_m2bQVgTVSLN8dhxuT0MEw
讨厌的原因不是目的性强,而是目标太狭窄
比如挣钱,如果还有一个原因,哪怕是为了让孩子上更好的大学,就不会觉得你目的性强
生存策略:把自己多层次的,丰富的目标主动暴露出来给别人看
刘润:如何赢得一场辩论?https://mp.weixin.qq.com/s/TPIU40vRXOzx5061AcH6lQ // good
Go之父说:不懂浮点数不配当码农…https://mp.weixin.qq.com/s/0lCte3UD5qYcaBnebwnYrQ
不懂这12个语法糖,别说你会Java!https://mp.weixin.qq.com/s/wIQAXFe208n0OVlX4tbKzg
高性能 Go 服务的内存优化(译):https://mp.weixin.qq.com/s/kfcuG1gbQLBY8HsAC92P9g
Git diff 常见用法: https://www.cnblogs.com/qianqiannian/p/6010219.html
Go 语言日志指南: https://linux.cn/article-8543-1.html
Go语言实战笔记(十八)| Go log 日志: https://www.flysnow.org/2017/05/06/go-in-action-go-log.html
Golang 优化之路——自己造一个日志轮子: https://blog.cyeam.com/golang/2017/07/14/go-log
Golang struct、interface 类型详解: https://www.jianshu.com/p/d87c69ac6ce7
golang的struct里面嵌入interface: https://www.jianshu.com/p/a5bc8add7c6e
字符串匹配的KMP算法: https://mp.weixin.qq.com/s/JeKZGc7MzSaaEl3nehi0pg
https://golangbot.com/pointers/
有疑问加站长微信联系(非本文作者)