ARTS 第11周

陈卧虫 · · 1083 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

ARTS 第11周分享

[TOC]

Algorithm

发现自己的算法能力太差了,打算从最基础的数据结构学习算法,将自己的基础给打扎实,

实现一个单项循环队列

[思路]

  1. 一个队列包含有前节点,指向第一个元素;尾节点,指向最后一个元素;最大尺寸,记录能够存储的最大元素数量;以及一个数组用来存储实际的数据(在golang中更适合用slice实现)
  2. 初始头和尾指针都指向下标为0的元素
  3. 通过预留一个空位来区别空队列与满队列,否则将很难区分二者
    1. 空:rear = front
    2. 满:(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

  1. golang 提供了log包,来追踪日志的记录

    1. 与fmt包很相似,但是输出默认带时间戳
  2. log包提供了可定制化的日志抬头信息

    1. 通过log.SetFlags 进行设置

    2. 可定义的常量选项

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提供的标准抬头信息 
)
      1. 设置了Lmicroseconds,那么Ltime就不生效了;设置了Lshortfile, Llongfile也不会生效
      2. LUTC比较特殊,如果我们配置了时间标签,那么如果设置了LUTC的话,就会把输出的日期时间转为0时区的日期时间显示。对我们东八区的时间来说,就会减去8个小时。
      3. LstdFlags表示标准的日志抬头信息,也就是默认的,包含日期和具体时间。(也就是不用设置,就是这个格式)
    • 通过log.SetPrefix可以指定输出日志的前缀

  • 在log包除了有Print系列的函数,还有Fatal以及Panic系列的函数。

    1. Fatal表示程序遇到了致命的错误,记录完日志然后退出。Fatal相当于先调用print打印日志,然后调用os.Exit(1) 退出程序。
    2. Panic函数先使用Print记录日志,然后调用Panic() 抛出一个恐慌(可以选择性的用recover() 恢复程序)
  • 实现原理: 关键的输出日志就在于std.Output方法。

    1. 输出目的地:

      1. os.Stderr对应的是UNIX里的标准错误警告信息的输出设备,同时被作为默认的日志输出目的地。除此之外,还有标准输出设备os.Stdout,以及标准输入设备os.Stdin。
      2. var ( Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout") Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr") )
      3. 以上就是定义的UNIX的标准的三种设备,分别用于输入、输出和警告错误信息。
    2. 在log包的SetOutput函数,可以设置输出目的地。

    3. 通过runtime.Caller,可以获取运行时方法的调用信息

      1. func Caller(skip int) (pc uintptr, file string, line int, ok bool)
      2. 参数skip表示跳过栈帧数,0表示不跳过,也就是runtime.Caller的调用者。1的话就是再向上一层,表示调用者的调用者。
      3. 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/

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:陈卧虫

查看原文:ARTS 第11周

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1083 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传