Go 阅读 negroni 源码

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

negroni 提供 golang 常用的中间件使用方式,项目地址 https://github.com/urfave/negroni/

阅读版本是 2019.6.2 的 7d1c5e commit

GoDoc - https://godoc.org/github.com/urfave/negroni

前提知识

了解 net/http server 的相关知识,也可以读我写的上一篇 【http-server】

基本使用

1
2
3
4
5
6
7
8
9
10
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page! "+req.URL.Path)
})

n := negroni.New()
n.Use(negroni.NewLogger())

n.UseHandler(mux)
n.Run(":3000")

其中关于 mux 变量的部分,可以参考上一遍 http-server,这里就不说明了,主要关注 n := negroni.New()

Go HTTP Server 使用分析

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

使用 net/http 包处理 http request

GoDoc - https://godoc.org/net/http

net/http 主要包括两部分

  • client
  • server

这里就是关于 server 部分

Tip: go version go1.12.4 darwin/amd64

Handler interface

查看 http.ListenAndServe 定义

1
2
3
4
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}

会发现第二个参数是 Handler 类型

1
2
3
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}

Handler 是一个接口定义,只要实现了 ServeHTTP(ResponseWriter, *Request) 方法的类型,都可以

Go - var & make & new 在复杂类型上的使用区别

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

这里主要讲解 var & make & new 在声明变量关于 array、slice、map、struct 这些类型上的区别。

预备知识

var 声明变量

var 变量名字 类型 = 表达式 ,如果省略了表达式,就使用类型的零值初始化变量

make 和 new 的知识

可以查看 GoDoc - builtin 的相关内容

  • new
    • func new(Type) *Type
    • 创建一个 Type 类型的匿名变量,初始为 Type 类型的零值,返回变量地址,返回的指针类型为*Type
  • make
    • func make(t Type, size ...IntegerType) Type
    • 分配并初始化一个类型为 slice 、map 、或 channel 的对象,返回类型与 Type 相同,而非指向它的指针

零值

  • array、struct,每个元素或字段都是对应该类型的零值
  • slice、map,对于零值 nil

排序算法

Algorithms 分类文章,为了在下次又忘记又想想起来的时候,稍微快速的回想一下。

排序方法很多,仔细想想还是快排最实用
冒泡排序、选择排序、桶排序、快速排序、归并排序、堆排序

群晖 Nas 使用 SSH Key 实现免密登录

最近直观的加上了文章访问统计和整站访问统计,虽然知道肯定没人访问,也就是纯粹加点新功能,但是没想到,关于 Nas 的文章访问量遥遥领先。

承接之前关于 Nas 的文章

开启了 VPN 可以更安全的访问 Nas ,同时我也需要使用 SSH 功能,但是每次使用的时候,都要输入密码,很是麻烦,如果能改成 ssh 免密登录就好了。
本质上跟其他的 linux 服务器设置免密登录原理差不多,稍微有点差别吧。

Go Method Receiver 方法接收器介绍

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

Receiver 基本介绍

就是类似于 Class 的 Method,使用 this 或者 self 调用 ?可以这么类比吧,但是并不等同。

看具体的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type IntReceiver struct {
X int
}

// 方法接收器声明
func (i IntReceiver) Double() int {
return i.X * 2
}

// 普通函数声明
func IRDouble(i IntReceiver) int {
return i.X * 2
}

func main() {
i := IntReceiver{3}
d1 := i.Double() // 在 i 上调用了 IntReceiver 类型带的 Method // func (i IntReceiver) Double() int
fmt.Printf("type = %T,value = %v\n", d1, d1)

d2 := IRDouble(i) // 调用了普通函数 // func IRDouble(i IntReceiver) int
fmt.Printf("type = %T,value = %v\n", d2, d2)
}

定义 method 并不局限于结构体 struct,可以任何 type 声明的类型定义 Method,最简单如 type DInt int ,就能为 DInt 类型定义 method

Go 运行的初始化

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

结论

先上简单结论

  • 初始化依赖包,也就是 import 的包
  • 在同一个包内,在解决依赖顺序的情况下,按照变量、常量出现的顺序依次初始化
  • 按照 init 函数出现的顺序运行
  • 运行 main 函数

Go 程序设计语言 - 笔记

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

是我在 2017 年中二刷 《Go 程序设计语言》的重点摘要。

使用了 SF - Notes

这里权当列表展示,最近也翻出来复习一下,查漏补缺。

Go 学习 - 环境设置

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

当前环境

  • 设备 MacBook Pro
  • 系统 macOS High Sierra 10.13.6
  • Go 版本 1.10.4

开发工具

Go 安装

  • 源码安装,https://golang.org/dl/ 下载相应的 goVERSION.src.tar.gz 即可
  • 标准包安装
  • 三方工具安装
    • homebrew,mac
    • apt-get、yum,linux
    • gvm