美文网首页
ARTS 第11周

ARTS 第11周

作者: 陈卧虫 | 来源:发表于2019-06-17 00:20 被阅读0次

    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周

          本文链接:https://www.haomeiwen.com/subject/boanfctx.html