Gin框架详解
Gin框架简介Gin是一个简单、快速而强大的Web框架,适用于构建各种规模的Web应用程序。它的设计理念是简洁、高效和易用,可以帮助开发人员快速构建高性能的Web服务。无论是构建API服务、Web应用还是微服务,Gin都是一个不错的选择。它具有类似martini的API,但性能要好得多,多亏了httprouter,速度提高了40倍。如果您需要性能和良好的生产力,您一定会喜欢Gin 。
不用gin框架实现简单web程序123456789101112131415161718192021222324package mainimport ( "fmt" "net/http")func main() { // 注册路由处理函数 http.HandleFunc("/hello", sayhello) // 启动HTTP服务器并监听指定端口 err := http.ListenAndServe(":9090", nil) if err != nil { fmt.Printf("错误:%v\ ...
Go实现socks5代理服务器
SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。
我们先来看一下最终写完的代理服务器的效果。我们启动这个程序,然后在浏览器里面配置使用这个代理,此时我们打开网页。代理服务器的日志,会打印出你访问的网站的域名或者IP,这说明我们的网络流量是通过这个代理服务器的。我们也能在命令行去测试我们的代理服务器。我们可以用curl –socks5 +代理服务器地址,后面加一个可访问的URL,如果代理服务器工作正常的话,那么 curl命令就会正常返回。
socks5协议原理:
源代码:
12345678910111213141516171819202122232425262728293 ...
Go实现在线词典翻译(三种翻译接口,结合sync)
运用goroutine,结合sync包,同时实现彩云翻译和百度翻译。可对输入的内容自动检测,完成英译汉,汉译英。
猜谜游戏(Go实现)
首先,代码导入了一些需要使用的包,包括 "bufio"、"fmt"、"math/rand"、"os"、"strconv" 和 "strings",这些包提供了处理输入输出、生成随机数和字符串处理的功能。接下来,在 main 函数中,定义了一个变量 maxNum,它表示可猜测的最大数字。然后使用 rand.Seed(time.Now().UnixNano()) 设置随机数生成器的种子,以确保每次程序运行时生成的随机数是不同的。然后使用 rand.Intn(maxNum) 生成一个介于 0 和 maxNum 之间的随机整数作为秘密数字。
反射详解
引入先看官方Doc中Rob Pike给出的关于反射的定义:
12Reflection in computing is the ability of a program to examine its own structure, particularly through types; it’s a form of metaprogramming. It’s also a great source of confusion.(在计算机领域,反射是一种让程序——主要是通过类型——理解其自身结构的一种能力。它是元编程的组成之一,同时它也是一大引人困惑的难题。)
维基百科中的定义:
在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。
不同语言的反射模型不尽相同,有些语言还不支持反射。《Go 语言圣经》中是这样定义反射的:
Go 语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制。
为什么要用 ...
select语句与CSP模型
select语句select 是 Go 中的一个控制结构。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
语法结构select语句的语法结构和switch语句很相似,也有case语句和default语句:
123456789select { case communication clause : statement(s); case communication clause : statement(s); /* 你可以定义任意数量的 case */ default : /* 可选 */ statement(s);}
说明:
每个case都必须是一个通信
所有channel表达式都会被求值
所有被发送的表达式都会被求值
如果有多个case都可以运行,select会随机公平地选出一个执行。其他不会执行。
否则:
如果有default子句,则执行该语句。
如果没有default字 ...
channel通道详解
channel通道通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。
在前面讲Go语言的并发时候,我们就说过,当多个Goroutine想实现共享数据的时候,虽然也提供了传统的同步机制,但是Go语言强烈建议的是使用Channel通道来实现Goroutines之间的通信。
“不要通过共享内存来通信,而应该通过通信来共享内存” 这是一句风靡golang社区的经典语
Go语言中,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成一个对象,然后把这个对象的指针传入某个channel中,另外一个goroutine从这个channel中读出这个指针,并处理其指向的内存对象。Go从语言层面保证同一个时间只有一个goroutine能够访问channel里面的数据,为开发者提供了一种优雅简单的工具,所以Go的做法就是使用channel来通信,通过通信来传递内存数据,使得内存数据在不同的goroutine中传递,而不是使用共享内存来通信。
什么是通道通道的概念通道是什么,通道就是goroutine之间的通道 ...
sync包
WaitGroupsync是synchronization同步这个词的缩写,所以也会叫做同步包。这里提供了基本同步的操作,比如互斥锁等等。这里除了Once和WaitGroup类型之外,大多数类型都是供低级库例程使用的。更高级别的同步最好通过channel通道和communication通信来完成。
WaitGroupWaitGroup,同步等待组。
在类型上,它是一个结构体。一个WaitGroup的用途是等待一个goroutine的集合执行完成。主goroutine调用了Add()方法来设置要等待的goroutine的数量。然后,每个goroutine都会执行并且执行完成后调用Done()这个方法。与此同时,可以使用Wait()方法来阻塞,直到所有的goroutine都执行完成。
Add()方法Add这个方法,用来设置到WaitGroup的计数器的值。我们可以理解为每个waitgroup中都有一个计数器用来表示这个同步等待组中要执行的goroutin的数量。
如果计数器的数值变为0,那么就表示等待时被阻塞的goroutine都被释放,如果计数器的数值为负数,那么就会引发恐慌,程序就报错 ...
runtime包与临界资源
runtime包尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。
常用函数runtime 调度器是个非常有用的东西,关于 runtime 包几个方法:
NumCPU:返回当前系统的 CPU 核数量
GOMAXPROCS:设置最大的可同时使用的 CPU 核数
通过runtime.GOMAXPROCS函数,应用程序何以在运行期间设置运行时系统中得P最大数量。但这会引起“Stop the World”。所以,应在应用程序最早的调用。并且最好是在运行Go程序之前设置好操作程序的环境变量GOMAXPROCS,而不是在程序中调用runtime.GOMAXPROCS函数。
无论我们传递给函数的整数值是什么值,运行时系统的P最大值总会在1~256之间。
go1.8后,默认让程序运行在多个核上 ...
电子科大计网期末复习之经典大题
试将TCP/IP与ISO/OSI七层模型相比较
相同点:
都是独立的协议栈的概念;层的功能大体相似。
不同点:
①ISO/OSI参考模型将服务、接口与协议的概念明确化,因此比 TCP/IP 具有更好的隐藏性,能够比较容易地进行替换;TCP/IP参考模型在服务、接口与协议的区别上不很清楚。
②ISO/OSI参考模型先有层的划分,后有各层协议;TCP/IP参考模型先有协议,后有层的划分。
③ISO/OSI参考模型划分为7层;TCP/IP参考模型划分为4层,没有会话层和表示层
④ISO/OSI的网络层支持无连接和面向连接的通信,传输层只支持面向连接的通信;TCP/IP的网络层只支持无连接的通信,传输层提供无连接和面向连接的通信。
TCP与UDP区别
1、TCP是面向连接服务的;UDP是无连接的2、TCP提供可靠的传输服务;UDP尽最大努力交付,即不保证可靠交付3、TCP面向字节流;UDP是面向报文段的4、UDP首部开销比较小,只有8字节,TCP最少首部为20字节,主要因为它实现的功能 ...