go Hijack

2023-10-27

golang(GO语言)http详解简单基础(1)



因为好像长时间的写PHP可能大家感觉烦躁了,所以写一点golang的东西大家可以拿去玩玩,golang在web开发中让你得心应手,其实也是很好的东西,只要你玩进去之后感觉好爽,感觉比PHP的好处就是没有那么多的“限制”,基础部分大家可以看下简单的我再前边更新了一点点后边会继续给大家补上的,以后就是PHP+golang也可能会写一些object-c的,废话不多说开始写了,所有的代码我放在BUYVM上搭建的GOweb 大家可以去http://www.lingphp.com:8080/demo/查看获取完整代码,现在www.lingphp.com刚弄yaf框架还没有做,大家不用测试攻击玩哈

web1.go

package main

import (
    "io"
    "net/http"
)

func hello(rw http.ResponseWriter, req *http.Request) {
    io.WriteString(rw, "hello widuu")
}

func main() {
    http.HandleFunc("/", hello)  //设定访问的路径
    http.ListenAndServe(":8080", nil) //设定端口和handler
}

这个我们就输出了hello word,然后我们从源码来解析这个东西,我们看到最后的main函数执行的是HandleFunc这个函数我们从源代码中找到这段的源代码来看如下

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

pattern是解析的路径的字符串,然后执行一个handler的函数方法,如上例子我们传入的hello,他会执行DefaultServeMux,我们在查看源代码的时候会看到var DefaultServeMux = NewServeMux()我们再查看NewServeMux这个源代码

func NewServeMux() *ServeMux {
        return &ServeMux{m: make(map[string]muxEntry)} 
}
//而里边的返回一个新的ServeMux
type ServeMux struct {
    // contains filtered or unexported fields
}

所以我们就可以这样字

//申明一个ServeMux结构
type MyHandler struct{}
mux := http.NewServeMux()
//我们可以通过一下 http提供的
func Handle(pattern string, handler Handler)  //第一个是我们的路径字符串 第二个是这样的 是个接口
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}
//实现这个接口我们就要继承ServeHTTP这个方法 所以代码
func (*MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "URL"+r.URL.String())
}
//我们查看源代码
func (mux *ServeMux) Handle(pattern string, handler Handler) //这个新的ServeMux低下的Handle来设置 这里的Handler也是Handler interface所以我们将这个
mux.Handle("/", &MyHandler{})
mux.HandleFunc("/hello", sayHello)// 我们一样可以通过handleFunc设置
//源代码func ListenAndServe(addr string, handler Handler) error 
http.ListenAndServe(":8080",mux) //所以我们把mux传进去

web2.go

//完整代码
package main

import (
    "io"
    "net/http"
)

type MyHandle struct{}

func main() {
    mux := http.NewServeMux()
    mux.Handle("/", &MyHandle{})
    http.ListenAndServe(":8080", mux)
}

func (*MyHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "URL"+r.URL.String())
}

然后我们继续深入点

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}
//返回的serve我们查看它的结构
type Server struct {
    Addr           string        // TCP address to listen on, ":http" if empty
    Handler        Handler       // handler to invoke, http.DefaultServeMux if nil
    ReadTimeout    time.Duration // maximum duration before timing out read of the request
    WriteTimeout   time.Duration // maximum duration before timing out write of the response
    MaxHeaderBytes int           // maximum size of request headers, DefaultMaxHeaderBytes if 0
    TLSConfig      *tls.Config   // optional TLS config, used by ListenAndServeTLS

    // TLSNextProto optionally specifies a function to take over
    // ownership of the provided TLS connection when an NPN
    // protocol upgrade has occurred.  The map key is the protocol
    // name negotiated. The Handler argument should be used to
    // handle HTTP requests and will initialize the Request's TLS
    // and RemoteAddr if not already set.  The connection is
    // automatically closed when the function returns.
    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
}
//我们自己设置
type MyHandle struct{}
server := http.Server{
        Addr:        ":8080",
        Handler:     &MyHandle{},
        ReadTimeout: 6 * time.Second,
    }
//我们查看过了 我们要实现路由分发映射就待这样 我们看到了下边的f 是一个HandlerFunc类型
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}
//所以我们申明一下
var mux map[string]func(http.ResponseWriter, *http.Request)
mux = make(map[string]func(http.ResponseWriter, *http.Request))
mux["/hello"] = hello
mux["/bye"] = bye
err := server.ListenAndServe()
if err != nil {
    log.Fatal(err)
}
//这样我们就可以做到了路径的映射 
func (*MyHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if h, ok := mux[r.URL.String()]; ok {
        h(w, r)
    }
    io.WriteString(w, "URL"+r.URL.String())
}

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello 模块")
}

func bye(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "bye 模块")
}
//可能有人不懂mux["/hello"] = hello 然后低下的h(w,r) 我简单的解释一下 看个例子 go里边都可以是类型
type test func(int) bool //定一个test的func(int) bool 类型
func isAdd(i int) bool {
    if i%2 == 0 {
        return false
    }
    return true
}

func filter(s []int, f test) []int {
    var result []int
    for _, v := range s {
        if f(v) {
            result = append(result, v)
        }
    }
    return result
}

func main() {
    slice := []int{1, 2, 3, 4, 5, 6, 7, 8}
    b := filter(slice, isAdd)
    fmt.Println(b)
}
//是不是懂点了 其实就类似于
f:=func(x int){
  fmt.Println("hello")
}
f();

web3.go

package main

import (
    "io"
    "log"
    "net/http"
    "time"
)

var mux map[string]func(http.ResponseWriter, *http.Request)

func main() {
    server := http.Server{
        Addr:        ":8080",
        Handler:     &MyHandle{},
        ReadTimeout: 6 * time.Second,
    }
    mux = make(map[string]func(http.ResponseWriter, *http.Request))
    mux["/hello"] = hello
    mux["/bye"] = bye
    err := server.ListenAndServe()

    if err != nil {
        log.Fatal(err)
    }
}

type MyHandle struct{}

func (*MyHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if h, ok := mux[r.URL.String()]; ok {
        h(w, r)
    }
    io.WriteString(w, "URL"+r.URL.String())
}

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello 模块")
}

func bye(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "bye 模块")
}

大家不懂的尽管问哈~~时间太晚了有点仓促


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go Hijack 的相关文章

  • 学习笔记(01):go快速入门-iota用法

    立即学习 https edu csdn net course play 26897 344142 utm source blogtoedu
  • 在Windows上搭建Go开发环境

    Go语言是由谷歌开发的一个高性能 跨平台的编程语言 安装Go 首先先来安装一下Go语言的SDK 目前Go语言的最新版本为Go 1 8 3 Go下载页面列出了各种操作系统的安装包 如果选择Windows MSI安装包的话 会将Go安装到C G
  • fabric中链码关于缺少go的包依赖问题的解决方法

    我们可以在cmd中下载依赖包 go get github com hyperledger fabric common util v1 4 go get github com hyperledger fabric core chaincode
  • Go编程技巧--io.Reader/Writer

    Go原生的pkg中有一些核心的interface 其中io Reader Writer是比较常用的接口 很多原生的结构都围绕这个系列的接口展开 在实际的开发过程中 你会发现通过这个接口可以在多种不同的io类型之间进行过渡和转化 本文结合实际
  • 使用 Go API 快速下载 excel 文件

    我们有几个 Golang API 可以为 csvfiles 提供服务 但在提供以编程方式生成的 excel 文件方面没有任何帮助 为了避免重新编写 我们可以借助此服务器开始 main go 这使我们能够服务于路由 和 excel downl
  • [GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题

    作为网络安全初学者 会遇到采用Go语言开发的恶意样本 因此从今天开始从零讲解Golang编程语言 一方面是督促自己不断前行且学习新知识 另一方面是分享与读者 希望大家一起进步 前文介绍了Go的编译运行 语法规范 注释转义及API标准库知识
  • go : GoLand安装及环境配置

    前因后果 新学期新气象 开学的第一节课是zw老师的区块链技术与应用领域 congratulations 涉及编程实验 使用Go语言 需要安装GoLand软件进行下一步 Go语言下载地址 golang下载链接 进去之后选择对应的版本下载 这里
  • go语言标准库

    在Go语言的安装文件里包含了一些可以直接使用的包 即标准库 Go语言的标准库 通常被称为语言自带的电池 提供了清晰的构建模块和公共接口 包含 I O 操作 文本处理 图像 密码学 网络和分布式应用程序等 并支持许多标准化的文件格式和编解码协
  • Go-OpenWrt获取wan口ip、dns、网关ip

    Go OpenWrt获取wan口ip dns 网关ip 文章目录 Go OpenWrt获取wan口ip dns 网关ip 1 前言 2 解决方案思路 3 代码 1 前言 一般来说 Openwrt可以配置多个wan口和多个lan口 这里获取的
  • Go项目配置管理工具---Viper

    目录 Viper概述 前言 功能 viper配置优先级 从Viper中获取值 读取配置文件 注册和使用别名 把值写入Viper 设置默认值 使用Set方法设置值 把配置信息写入配置文件 从io Reader中读取配置信息到viper 监控V
  • golang数据结构初探之动态数组slice

    动态数组slice slice 又称动态数组 依托于数组实现 可以方便的进行扩容和传递 实际使用时比数组更灵活 但正是因为灵活 实际使用时更容易出错 避免出错的最好方法便是了解其实现原理 特性速览 初始化 声明和初始化切片的方式主要有以下几
  • 使用Go Hijack和jQuery轻松实现异步推送服务

    使用Go Hijack和jQuery轻松实现异步推送服务 首先要说明的是 这里实现的异步推送服务采用的是Long Polling方式 并不是Comet 如果想用Comet来实现的话 可以参考这个开源项目 http cometd org 不过
  • Go单体服务开发最佳实践

    单体最佳实践的由来 对于很多初创公司来说 业务的早期我们更应该关注于业务价值的交付 并且此时用户体量也很小 QPS 也非常低 我们应该使用更简单的技术架构来加速业务价值的交付 此时单体的优势就体现出来了 正如我直播分享时经常提到 我们在使用
  • Go Web编程实战(3)----数据类型

    目录 前言 布尔型 数字类型 字符串类型 使用 byte修改 使用 rune修改 指针类型 指针的简单用法 修改指针值 复合类型 数组类型 结构体介绍 切片类型 从指定范围生成切片 重置切片 直接声明切片 Map 前言 Go语言数据类型包括
  • go添加国内镜像加速

    添加国内镜像加速 七牛云 七牛云镜像 全球CDN加速 全球CDN加速 打开你的命令终端输入Go 1 13 及以上 推荐 go env w GO111MODULE on go env w GOPROXY https goproxy cn di
  • Go基础(包、变量和函数):开启Go语言之旅

    开启Go语言之旅 Go编程语言是一个开源项目 可以让程序员提高工作效率 Go是富有表现力 简洁 干净和高效的 其并发机制使编写充分利用多核和联网机器的程序变得容易 而其新颖类型系统则可实现灵活的模块化程序构建 快速编译为机器代码 但具有垃圾
  • Go语言学习18-基准测试

    基准测试 引言 基准测试 1 编写基准测试函数 2 计时器 3 内存分配统计 4 基准测试的运行 结语 引言 所谓基准测试 Benchmark Test 简称BMT 是指 通过一些科学的手段实现对一类测试对象的某项性能指标进行可测量 可重复
  • go语言exec包调用shell命令

    工程中需要用到ffmpeg 想直接用exec包调用shell命令 本来以为很简单 结果折腾了一下午 最后查到了解决方案 假如之前执行报错的语句为 cmd exec Command echo helloworld out err cmd Ou
  • Golang并发安全和锁

    目录 场景 互斥锁 读写互斥锁 互斥锁 读写锁 Sync Once sync Map 定时器 场景 有时候在Go代码中可能会存在多个goroutine同时操作一个资源 临界区 这种情况会发生竞态问题 数据竞态 类比现实生活中的例子有十字路口
  • go语言教程哪里有?go 语言优秀开源项目汇总

    目录 监控系统 容器技术 PaaS工具 大数据 微服务 CI CD 数据库技术 存储技术 分布式系统 消息系统 服务器管理 安全工具 网络工具 Web工具 Web框架 区块链技术 其它 监控系统 项目 简介 OpenFalcon OpenF

随机推荐

  • 如何正确使用QTcpSocket的readyRead信号?

    一 问题描述 你之所以会来看我这篇文章 大概是遇到了一下几个问题 1 使用QTcpSocket时 readyread函数没有触发 或者触发了 但是触发次数不是自己想象的那样 2 readyread槽函数中 接收到的数据不对 我们先看一下Qt
  • hashmap为什么用红黑树_关于HashMap的实现,一篇文章带你彻底搞懂,再也不用担心被欺负

    推荐学习 刷透近200道数据结构与算法 成功加冕 题王 挤进梦中的字节 面试官杠上Spring是种什么体验 莫慌 送你一套面试 大纲 源码 前言 在介绍HashMap之前先了解一个别的东西 红黑树 这边提前声明下 发布文章的时候没太注意 有
  • vue当前(路由)页面跳转当前(路由)页面,刷新数据

    最近呢 总是踩坑 就是那种今天我写了代码 但是吧一直报错 然后明天再写就对了 咱也不知道是为啥 咱也不知道是咋回事 只能说萌新小白在线吃菜 言归正传 最近写了一个商品详情页 在当前商品详情页 还可以跳到另一个商品的详情页 也就是改变参数 当
  • kudu : 扩容报错 Bad status: Not found: Unable to initialize catalog manager

    文章目录 1 美图 2 背景 1 美图 2 背景 kudu 原本只有一个master 和一个 tableServer 现在我想扩容成3个master 3个tableServer 然后报错了 错误信息如下
  • C++递推经典案例No.1——青蛙跳台问题

    一只青蛙一次可以跳上1级台阶 也可以跳上2级台阶 求该青蛙跳上一个 n 级的台阶总共有多少种跳法 这是一个经典的递归 动态规划的例题 代码部分并不难 关键是要理清思路 由于每次可以跳1个或者两个 所以跳到当前台阶的来源只有两种 下一个和下两
  • Android Studio 修改AVD模拟器文件默认存储路径

    AndroidStudio默认的模拟器文件路径为 C Users 用户名 android avd路径 通常windows系统上 C盘不是太大 而avd文件却不小 通常几个GB 所以有必要将avd路径换到一个非系统盘 更换方法如下 Help
  • sql 列名无效

    在SQLServer2008中 当设计 修改 表结构之后 再用SQL语句时 列名会显示无效 但执行可以通过 如下图 原因是SQL Server的intellisense 智能感知功能 需要重新整理一下 用快捷键Ctrl Shift R即可
  • YOLO:使用cv旋转图片,绘制最小矩形框,生成txt数据集,可用于yolo训练模型

    目录 一 前期的目录准备 二 代码部分需要用到的cv函数 三 cv部分函数参数详情 四 旋转方式 五 代码部分 六 代码完整版 一 前期的目录准备 创建一个名为rice的目录 在此下创建arborio basmati等五类米的子目录 并且分
  • (Android版)AR 现实增强 高通 Vuforia QCAR SDK环境搭建

    1 下载高通SDK 高通刚刚才更新开发中心地址 版本更新为V2 0 https developer vuforia com resources sdk android 下载对应系统的安装程序 下载完成后 你就下一步下一步安装吧 2 编译QC
  • Zotero使用

    zotero使用 实验平台 Zotero安装 导入文献到Zotero 设置PDF文件保存位置 Zotfile插件安装 Zotero文献同步 在Zotero中导入PDF翻译插件 参考文献 实验平台 Windows10 Mac平台有些设置的名字
  • Azkaban的囚徒——Azkaban运行模式和流

    文章目录 Azkaban运行模式 Azkaban运行 Azkaban 流 Job Dependency Azkaban运行模式 在3 x版本里 提供了3种运行模式 the stand alone solo server mode stand
  • 服务器安装系统要如何载入驱动程序,Dell 服务器安装Windows 2008 R2时手动加载阵列卡驱动...

    使用操作系统光盘或U盘安装操作系统 需要事先准备好对应的阵列卡驱动 安全完成后需要自行手动加载主板 显卡 网卡驱动 1 开机之后通过界面提示通过键盘按下 F11 进入 Boot Manager 选择启动选项 2 在 Boot Manager
  • Oracle 数据库索引扫描方式

    1 索引范围扫描 Index Range Scan 当我们在查询操作中使用了 WHERE 子句进行范围查询时 Oracle 数据库会使用索引范围扫描方式 这种扫描方式通过索引键值的范围来定位需要的数据 例如 我们有一个名为 orders 的
  • 2012.11.20

    昨晚到23 50 实在是困了 于是睡了 发现 杆9其实是个虚拟杆 也就是说 相当于一个辅助线 不INITGEOMETRY 不绘制 只计算 现在设定P1的点 根据余弦定理求出 三角形P1P2P3中 P2对应的角度 a 2 b 2 c 2 2b
  • 为学生夫妻安排一间宿舍两张床,武大的回应亮了

    来源 中国青年报综合自武汉大学官微 身高太高 睡不下宿舍的床咋办 行动有障碍 不方便睡上下铺咋办 第一次来到南方 湿度太大怎么晾衣服 学生夫妻可以申请合宿吗 这两天 武大 宿舍定制服务 在网上刷屏 引发关注 1 学校为 持证上岗 的夫妻档准
  • python3+robotframework+selenium3 浏览器兼容性测试

    robot framework 测试浏览器兼容性 目前ride已支持一下浏览器 firefox ie chrome safari 本次我们已win 10中的ie为例 来看看如何使用python3 robotframework seleniu
  • 一次SpringBoot版本升级,引发的血案

    前言 最近项目组升级了SpringBoot版本 由之前的2 0 4升级到最新版本2 7 5 却引出了一个大Bug 到底是怎么回事呢 1 案发现场 有一天 项目组的同事反馈给我说 我之前有个接口在新的测试环境报错了 具体异常是 Missing
  • Git基本操作命令

    目录 一 简介 二 基本命令使用 1 git add 将该文件添加到暂存区 2 git status 命令用于查看在上次提交之后是否有对文件进行再次修改 3 git diff 比较文件在暂存区和工作区的差异 4 git commit 将暂存
  • [NOIP2014]珠心算测验 T1

    珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术 珠心算训练 既能够开发智力 又能够为日常生活带来很多便利 因而在很多学校得到普及 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法 他随机生成一个正整数集合 集合中的
  • go Hijack

    golang GO语言 http详解简单基础 1 因为好像长时间的写PHP可能大家感觉烦躁了 所以写一点golang的东西大家可以拿去玩玩 golang在web开发中让你得心应手 其实也是很好的东西 只要你玩进去之后感觉好爽 感觉比PHP的