golang--初步学习http服务器相关操作

本文介绍如何使用Golang编写Web服务器,包括三种不同方式实现HTTP请求处理和服务启动过程。从简单的文本响应到更复杂的服务器配置均有涉及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节主要编写golang代码,调用http相关接口,实现web连接和信息的处理。

学习的过程由简入繁,通过3段代码了解并熟悉http的相关接口,实现一些客户端和服务端的简单交互。

1、浏览器打开本地ip,在浏览器输出服务器传送过来的信息文字。

package main

import (
	"net/http"
	"log"
)

func main(){
	//绑定监听方法
	http.HandleFunc("/", sayHello)

	log.Println("Start server version 1")
	//指定端口号(不要与其他程序发生冲突)
	log.Fatal(http.ListenAndServe(":5000", nil))
}

//注意:ResponseWriter是引用类型,而Request是结构体,传入的的内存地址
func sayHello(w http.ResponseWriter, req *http.Request){
	//在响应返回中设置返回信息
	w.Write([]byte("Hello, this is version 1!"))
}

在网址上输入:

输出结果为:

2、为了让程序更灵活,我们对上例的代码进行一些修改,不直接使用http.HandleFunc接口,而是做相关的扩展。

首先我们看下http.HandleFunc的源码:

我们可以看到,HandleFunc函数其实是调用了DefaultServeMux的HandleFunc方法,接下来我们看看DefaultServeMux的相关定义:

DefaultServeMux其实就是http内部定义的ServeMux类型数据的内存地址,在上面的源码中可以看到,调用http.NewServeMux()方法就能创建ServeMux数据。

修改后的代码如下:

package main

import (
	"log"
	"net/http"
)

func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/", sayHello)

	log.Println("Start server version 2")
	log.Fatal(http.ListenAndServe(":5000", mux))
}

func sayHello(w http.ResponseWriter, req *http.Request) {
	w.Write([]byte("Hello, this is version 2"))
}

输出结果为:

3、在上例代码的基础上继续改进。

绑定监听方法除了用ServeMux的HandleFunc外,还可以使用ServeMux的Handle()方法,

Handle方法更加灵活、扩展性更强。Handle()方法的参数第一个不变,第二个是参数http.Handler接口,我们需要定义一个继承了http.Handler接口的struct类型,并为这个类型实现ServeTTP方法。另外不再使用http.ListenAndServe方法,改为创建http.Server数据并调用其ListenAndServe方法,完整代码如下:

package main

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

func main() {
	mux := http.NewServeMux()
	//调用自定义的handler
	mux.Handle("/", &MyHandler{})

	//创建server,可以设置其中的参数值,更加灵活
	server := &http.Server{
		Addr:         ":5000",
		WriteTimeout: 2 * time.Second,
		Handler:       mux,
	}

	log.Println("Start server version 3")
	//不使用http.ListenAndServe方法,改为调用server.ListenAndServe
	log.Fatal(server.ListenAndServe())
}

type MyHandler struct{}

func (h *MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	w.Write([]byte("Hello, this is version 3"))
}

运行结果为:

4、配合channel控制server的关闭

完整代码如下:

package main

import (
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"
)

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

	server := http.Server{
		Addr:         ":5000",
		WriteTimeout: 5 * time.Second,
		Handler:      mux,
	}

	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt)

	go func() {
		<-quit
		if err := server.Close(); err != nil {
			log.Fatal("Close server!", err)
		}
	}()

	log.Println("Start server version 3")
	err := server.ListenAndServe()
	if err != nil {
		if err == http.ErrServerClosed {
			log.Println("Server close under request!")
		} else {
			log.Println("Server close under unexpected!")
		}
	}
	log.Println("Server exit")
}

type myHandler struct{}

func (h *myHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	w.Write([]byte("Hello, this is version 3"))
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值