ARTS 第11周

栏目: Go · 发布时间: 6年前

内容简介:[TOC]发现自己的算法能力太差了,打算从最基础的数据结构学习算法,将自己的基础给打扎实,实现一个单项循环队列

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/

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Tangled Web

The Tangled Web

Michal Zalewski / No Starch Press / 2011-11-26 / USD 49.95

"Thorough and comprehensive coverage from one of the foremost experts in browser security." -Tavis Ormandy, Google Inc. Modern web applications are built on a tangle of technologies that have been de......一起来看看 《The Tangled Web》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具