go语言的net/http包的基础使用

深入理解Go语言网络编程:golang-net项目解析 本文还有配套的精品资源,点击获取 简介:开源项目-golang-net.zip是一个关于HTTP/2协议实现的Go语言网络编程项目,由知名开发者Bradfitz开发。该项目让开发者可以深入了解Go语言在网络编程的应用,掌握高效的HTTP/2通信实现。文章内容将详细讲解Go语言基础、HTTP/2协议的核心特性、Go网络库的使用技巧、多路复用、二进制分帧、头部压缩以及Go并发模... 阅读详情

写一个能发声get请求的http协议的client端

func main() {
	resp, err := http.Get("http://www.baidu.com") //使用get方法请求百度主页的内容.
	if err != nil {
		fmt.Printf("get failed ,err :%v\n", err)
		return
	}
	defer resp.Body.Close() //注意这里使用defer关闭的是resp.body
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("read from resp.Body failed,err :%v\n", err)
		return
	}
	fmt.Print(string(body)) //这里要将body内容转换成字符串形式进行显示.
}

返回结果
网页返回的结果.

带参数的get请求实例

var wg sync.WaitGroup

func worker() {
	for {
		fmt.Println("worker")
		time.Sleep(time.Second)
		
	}
wg.Done() //这里是无法退出的.因为进入到worker函数中后执行for循环,循环没又退出的条件.

}

func main() {
	wg.Add(1)
	go worker()
	wg.Wait()
	fmt.Println("over")

}

使用全局变量让grouting退出

//全局变量方式
var wg sync.WaitGroup
var exit bool

func worker() {
	for {
		fmt.Println("worker")
		time.Sleep(time.Second)
		if exit {
			break
		}
	}
	wg.Done()
}

func main() {
	wg.Add(1)
	go worker()
	time.Sleep(time.Second * 3)
	exit = true
	wg.Wait()
	fmt.Println("over")
}
输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\fuwud>fuwud.exe
worker
worker
worker
over

使用通道方式退出

//通道方式退出
var wg sync.WaitGroup

func worker(exitChan chan bool) {
LOOP:
	for {
		fmt.Println("sorker")
		time.Sleep(time.Second)
		select {
		case <-exitChan:
			break LOOP
		default:

		}

	}
	wg.Done()
}

func main() {
	var exitChan = make(chan bool)
	wg.Add(1)
	go worker(exitChan)
	time.Sleep(time.Second * 3)
	exitChan <- true
	close(exitChan)
	wg.Wait()
	fmt.Println("over")
}
输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\fuwud>fuwud.exe
sorker
sorker
sorker
over

说明一下.这里使用的是channel方式进行退出操作.
将groutine中预先设置传参类型为channel类型,==>在main中将制定的值传入到channel中,==>channel中的数据在groutine中就成了一个触发点.只要满足channel的触发条件就可以退出groutine.

使用官方推荐的版本退出groutine

//官方版本退出groutine

var wg sync.WaitGroup

func worker1(ctx context.Context) {
LOOP:
	for {
		fmt.Println("worker1")
		time.Sleep(time.Second)
		select {
		case <-ctx.Done(): //将触发结束标志.结束当前循环.跳出LOOP循环体.
			break LOOP
		default:

		}
	}
	wg.Done() //减少计数.为主函数中的
}

func worker2(ctx context.Context) {
LOOP:
	for {
		fmt.Println("worker2")
		time.Sleep(time.Second)
		select {
		case <-ctx.Done():
			break LOOP
		default:

		}
	}
	wg.Done()
}

func main() {
	ctx, cancel := context.WithCancel(context.Background()) //声明ctx参数+方法,和cancel结束标志,在后面的groutine的时候调用.
	wg.Add(2)
	go worker1(ctx)
	go worker2(ctx)
	time.Sleep(time.Second * 3)
	cancel()  //一个结束信号,向goroutine中专递一个参数.让groutine出发结束标志.
	wg.Wait() //统计groutine数量全部结束.并向下执行其他语句.(如果没有的话也可以向下执行其他语句,但是不能保证groutine全部关闭.
	fmt.Println("over")
}

输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\fuwud>fuwud.exe
worker1
worker2
worker2
worker1
worker1
worker2
worker1
worker2
over

 

func gen(ctx context.Context) chan int {
	dst := make(chan int)
	n := 1
	go func() {
		for {
			select {
			case <-ctx.Done():
				return
			case dst <- n:
				n++
			default:

			}
		}
	}()
	return dst
}

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel() //结束goroutine

	for n := range gen(ctx) {
		fmt.Println(n)
		if n == 5 {
			break
		}
	}
}

输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\fuwud>fuwud.exe
1
2
3
4
5

上面的示例代码中,gen函数在单独的goroutine中生成整数并将它们发送到返回的通道。 gen的调用者在使用生成的整数之后需要取消上下文,以免gen启动的内部goroutine发生泄漏。

 使用预设值的超时时间进行groutine的退出

var wg sync.WaitGroup

func worker(ctx context.Context) {
LOOP:
	for {
		select {
		case <-ctx.Done(): //50毫秒后自动调用.
			break LOOP
		default:  //将默认的操作放到default中进行操作更容易理解一些.
			fmt.Println("db connecting ...")
			time.Sleep(time.Millisecond * 10) //假设正常连接数据库耗时10毫秒
		}
	}
	fmt.Println("worker done")
	wg.Done()
}

func main() {
	//设置一个50毫秒的超时时间,一单时间到了就会自动调用groutine中的ctx.done()用来结束groutine
	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*50)
	wg.Add(1)
	go worker(ctx)
	time.Sleep(time.Second * 5)
	cancel() //通知子groutine结束
	wg.Wait()
	fmt.Println("Over")
}

输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\fuwud>fuwud.exe
db connecting ...
db connecting ...
db connecting ...
db connecting ...
db connecting ...
worker done
Over

waitValue

type TranceCode string

var wg sync.WaitGroup

func worker(ctx context.Context) {
	key := TranceCode("Trance_CODE")
	tranceCode, ok := ctx.Value(key).(string) //在groutine中获取trace code
	if !ok {
		fmt.Println("invalid trace code")
	}
LOOP:
	for {

		select {
		case <-ctx.Done():
			break LOOP
		default:
			fmt.Printf("worker,trace code %s\n", tranceCode)
			time.Sleep(time.Millisecond * 10)
		}
	}
	fmt.Println("worker done!")
	wg.Done()
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*50) //这里传入的貌似是一个时间段用来设定超时时间.
	// 到了时间之后就将一个结束参数传入到goroutine中.
	ctx = context.WithValue(ctx, TranceCode("Trace_CODE"), "123445324234")
	wg.Add(1)
	go worker(ctx)
	time.Sleep(time.Second * 5)
	cancel()
	wg.Wait()
	fmt.Println("over")
}
输出结果
D:\Go\Go\src\code.oldboy.com\studygolang\05lesson5\fuwud>fuwud.exe
invalid trace code
worker,trace code
worker,trace code
worker,trace code
worker,trace code
worker,trace code
worker done!
over

 

【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码) 本系统采用SG90舵机Maix Bit摄像头STM32C8T6主控板以及LX_TRIG_MP3_V6.0语音播报模块,构建了一套高效的智能垃圾分类系统,综合运用了图像识别、语音播报及精准控制技术。SG90舵机负责控制垃圾桶的开盖操作。该舵机通过接收PWM信号来实现转动,内部有一个基准电路产生周期为20ms的PWM信号,通过外部脉冲信号的控制(高电平时间在0.5ms至2.5ms之间),使得舵机的输出轴转动到指定位置。舵机内的位置反馈电位计。 阅读详情

相关推荐

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1906

Go语言http简单封装,自己理解

go语言http简单封装

东方客的博客 1287

Jev模型入门:从API接入到本地部署的完整实践指南

大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma

weixin_29057237的博客 358

Go语言学习日志之defer机制

Go语言学习日志之defer机制 今天在学习Go语言中的函数时,遇到了用于延迟函数调用的defer关键字,觉得defer机制对于我日后用Go开发项目会有重大的意义,于是写这篇博客来记录我的学习心得。 话不多说,先来看defer关键字的用法: defer resp.Body.Close() 可以看出用法很简单,就是在正常的语句前加上一个defer关键字就行了。defer关键字修饰的语句会推迟到执行return语句或函数执行完毕以及发生错误之后才会执行。defer语句常用于成对的操作,例如打开和关闭,连接和断

Wangxihe0124的博客 604

基于大模型的重度膝关节骨关节炎全流程预测与治疗方案研究

本研究基于大模型构建了重度膝关节骨关节炎(KOA)预测体系,涵盖术前风险预测、手术方案优化、术中监测和术后康复指导全流程。通过分析临床和影像数据,模型在手术风险预测准确率(85%)、并发症预警(血栓预测准确率88%)等方面显著优于传统方法。研究实现了临床数据与AI技术的深度融合,术前预测指导麻醉选择(如高危患者推荐椎管内麻醉),术中实时监测生命体征,术后个性化康复方案使患者HSS评分平均提升45分。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1389

实战游戏项目管理1-规划篇

1、前言 做研发管理10多年,进游戏行业8年,经验下来项目管理就是一门技术,结合不同行业不同项目加以不同管理方法,但原理基本一样,这里总结下游戏项目的管理一些实操方法 一般游戏确定立项前都需要做,项目预研产出一个游戏Demo,通过公司的立项评审,这个过程的项目管理相对简单一般由制作人或其他项目经理兼任,只有控制好总体时间与成本就好,这里按立项后开始讲。 2、游戏项目规划 ...

pengdali的专栏 2万+

开发日记之注意defer的位置

golang报的一个错: 下面代码将报错,提示 golang http panic: runtime error: invalid memory address or nil pointer dereference resp, _ := http.Get(url) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) 正确的应是:defer resp.Body.Close() 应在 ioutil.ReadAll之后 resp, _ :=

KO_NO_JOJO的博客 450

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 338

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求

在现代软件开发中,网络编程扮演着至关重要的角色。随着应用程序变得越来越依赖于网络通信,开发者需要更有效的工具来监控和优化网络请求。Go语言,作为一门高效的系统编程语言,提供了丰富的标准库来支持网络相关的开发工作。其中,包为HTTP请求提供了深入的跟踪能力。httptrace包的设计目标是使开发者能够钩入HTTP请求的生命周期中的各个阶段,如连接的建立、连接复用的决策、请求的发送等,从而获得关于网络时延、网络错误以及性能瓶颈的详细信息。这种深入的信息获取能力,使得开发者可以对网络请求进行细粒度的分析和优化。

walkskyer的博客 1325

[QMT量化交易小白入门]-四、如何筛选优质可转债,并进行下单操作

通过上述步骤,成功地使用Python代码完成了可转债的筛选、数据处理和下单操作。当然,这只是一个基础的示例,实际投资中还需要考虑更多因素,如市场环境、资金管理、风险控制等。希望本文能为各位投资者提供一些有价值的参考,助力大家在投资道路上走得更远。

木头大左的博客 1732

基于SC、SCL、BP、SCAN和SSC的译码算法及Matlab代码

本文将介绍几种常见的译码算法,包括SC(Successive Cancellation)、SCL(Successive Cancellation List)、BP(Belief Propagation)、SCAN(Soft-Input Soft-Output Successive Cancellation)、SSC(Stacked Successive Cancellation)的原理,并提供相应的Matlab代码实现。以上是基于SC、SCL、BP、SCAN和SSC的译码算法的Matlab代码示例。

ByteWhisper的博客 946

go语言使用http/net包中的post方法

go语言使用http/net包中的post方法 package main import ( "fmt" "io/ioutil" "net/http" "strings" ) func main() { resp, err := http.Post("http://www.baidu.com", //请求的url地址 "application/x-www-from-urlencoded", //设置表头 strings.NewReader("user=admin&amp

crontab_e的博客 512

Python 实战:手语翻译系统——从视频到文本的智能转换

今天,我们用 Python 构建了一个。

Echo_Wish 344

Go语言net/http包使用详细介绍

Go的http有两个核心功能:Conn、ServeMux(多路复用器) Go 提供了一系列用于创建 Web 服务器的标准库,而且通过 Go 创建一个服务器的 步骤非常简单,只要通过 net/http 包调用 ListenAndServe 函数并传入网络地址以及负责处理请求的处理器( handler )作为参数就可以了。如果网络地址参数为空字符串,那 么服务器默认使用 80 端口进行网络连接;如果处理器参数为 nil,那么服务器将使用默认的多路复用器 DefaultServeMux。Conn的goroutin

肥叔菌的博客 3797

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Go 语言net/http 包使用模式:监听多端口等等

为什么80%的码农都做不了架构师?>>> ...

weixin_33860528的博客 1113

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入探索Go语言:使用net/http/httptest包进行高效HTTP测试

在现代软件开发中,确保代码的健壮性和可靠性是每个开发者的首要任务。包是Go语言标准库中一个极为有用的工具,它提供了一系列的功能来帮助开发者测试HTTP应用,无论是简单的API接口还是复杂的Web应用。通过模拟HTTP请求和响应,httptest使得单元测试和集成测试变得简单而高效。本文将详细介绍如何使用包进行有效的HTTP测试。文章的重点在于实战开发,我们将通过多个示例和高级技巧,展示如何使用这个包来提升你的测试效率和代码质量。本文不会涉及Go语言的安装和基础语法,而是直接进入到httptest。

walkskyer的博客 695

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Go语言使用net/http包编写Web 服务器

func main() { http.HandleFunc("/", sayhelloName) // 设置访问的路由 err := http.ListenAndServe(":9090", nil) // 设置监听的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } } 上面这个代码,我们 build 之后,然后执行 web.exe, 这个时候其实已经在 9090 端口监听 http 链接请求了。

肥叔菌的博客 1004

Go语言备忘录(3):net/http包的使用模式和源码解析

本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录(3):net/http包的使用模式和源码解析,多谢! 目录: 一、http包的3个关键类型 二、HTTP服务器的使用模式 三、HTTP服务器的执行过程 四、重定向 五、客户端的实现 一、http包的3个关键类型: ...

weixin_34302561的博客 191

Go 语言 net/http 包使用:HTTP 服务器、客户端与中间件

围绕 Go 语言标准库中的net/http包展开,详细介绍了其在搭建 HTTP 服务器、处理客户端请求以及实现中间件模式等方面的使用方法。

有耐心做好简单事情,坚持写blog 1510

go语言使用http/net包中的http请求中的Get方法

go语言使用http/net包中的http请求中的Get方法 代码如下: package main import ( "fmt" "io/ioutil" "net/http" ) func main() { response, err := http.Get("http://www.baidu.com") if err != nil { fmt.Println(err) } body, _ := ioutil.ReadAll(response.Body) //使用ioutil读

crontab_e的博客 814

Go 语言net/http 包使用模式

译注: 这篇文章的内容非常基础,也非常容易理解。原文地址,感觉是最能清晰的讲述了net/http包的用法的一篇,故翻译一下共享之。 一切的基础:ServeMux 和 Handler Go 语言中处理 HTTP 请求主要跟两个东西相关:ServeMux 和 Handler。 ServrMux 本质上是一个 HTTP 请求路由器(或者叫多路复...

weixin_34150224的博客 308

Go 爬虫三种框架的基本使用介绍

Colly 是一个简单而又强大的 Go 爬虫框架,其使用起来非常方便。在 Colly 中,我们可以通过注册回调函数来处理页面中的数据,同时还可以使用 CSS 选择器进行页面元素的定位。Colly 还支持异步请求、代理、Cookie 管理等功能,是一个非常实用的爬虫框架。我们已经成功地使用Go语言的http包和goquery包创建了一个简单的网页爬虫。我们首先使用http包发起了GET请求,接下来使用ioutil包读取响应体的内容,并使用goquery包解析了HTML代码。

m0_64288219的博客 4893

换个语言学一下 Golang (12)——Web基础

换个语言学一下 Golang (12)——Web基础 一、web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢?对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS...

weixin_30249203的博客 182
上一篇: go语言strconv基础操作
下一篇: go语言数据库基本操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值