这里写目录标题
Cookie、Session、Token、JWT之间的区别
略
对HTTP协议有什么了解
超文本传输协议,互联网应用广泛使用的网络协议,
处于TCP/IP协议族的应用层
使得客户端能够向服务器请求网页,图片,脚本等资源,
主要作用于客户端与服务端之间的通信,
HTTP有哪些方法
GET:从服务器获取资源,比如浏览器地址栏输入一个网址去查看网页内容,通常就是发送GET请求,请求参数在URL之后,一般是幂等性的:多次执行相同GET,结果一样,并且安全,不会对资源进行修改等操作
POST:常用于向服务器提交数据,不是幂等的,多次操作结果可能不一样
PUT:更新服务器上资源,可能要求客户端提供完整的资源数据
DELETE:删除一些指定资源
HEAD:和GET类似,但是只返回响应头的信息,一般用于判断资源是否存在,查看资源最后需改时间等情况
OPTIONS:获取HTTP服务器支持的http请求方法,允许客户端查看服务器性能,比如ajax跨域时的预检
TRACE:测试和诊断,一般禁用,防止被攻击
CONNECT, HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。
什么情况会用到post方法
注册登录,表单提交或保存,文件上传
HTTP Body的四种格式
**form-data:**表单数据
上传键值对,文件
**x-www-from-urlencoded:**表单数据转成键值对,
name=oneby&hobby=coding
raw 可以上传任何文本
text,javascript,json,html,application/xml
等操作,一般是传json
binary,上传文件,一次一个文件,(少出现)
golang中可读可写(可执行IO操作)的文件一般会实现哪些接口(Reader,Writer接口)
io.Reader接口,实现了Read方法,从源读取数据到切片p中
io.Writer接口:将字符切片p的数据写入目标
HTTP的协议定义,报文是什么样的
GET http://jsuacm.cn/ HTTP/1.1
Host: jsuacm.cn
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4506.400
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
//"请求数据"(GET方式的请求一般不包含)
http1和http2的区别
HTTP/1.x:
特点:
基于文本的协议,请求和响应以文本形式传输,容易理解和调试。
采用短连接或长连接(通过 Connection: keep-alive)来提高性能,但一个连接同时只能处理一个请求 / 响应序列,会出现队头阻塞问题,即如果一个请求阻塞,后续请求会被延迟。
通常使用 TCP 三次握手建立连接,性能在高并发场景下可能受限。
示例:
一个简单的 HTTP/1.1 请求:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
redis相关问题
略
gin的使用过程
1.go get gin 引入gin
2.在代码里导入gin的包
3.初始化默认Gin引擎(gin.Default())
4.定义路由和处理函数(数据库操作等)
5.启动web服务(router.Run())
6.中间件(日志或者身份认证)
GORM是什么
Go的一个对象关系映射库
可以帮忙映射go结构体与数据库的表
提供API帮助编写复杂sql,支持事务
怎么设计一个channel
channel是一个内置的数据类型,提供一种同步和通信机制,确保并发安全,类似一个管道一边发一遍接
1.定义一个"消息"的结构体,以结构体为数据结构创建msgCh
2.创建发送消息的协程,并在协程里传递数据给msgCh
3.在主协程上打印
go
// 传递自定义结构体的 Channel
type Message struct {
Content string
Sender string
}
msgCh := make(chan Message)
go
go func(){//创建一个协程
msgCh <- Message{
Content: "Hello, World!",
Sender: "Alice",
}
向msgCh里面传入数据
}
//打印到主协程
fmt.Println(<-msgCh)
什么是RPC
RPC意思是远程过程调用,一种通信协议,允许一个服务调用另一个服务,就像是在调用本地的方法一样,无需了解网络通信,序列化和反序列化等细节,
比如说gRPC是谷歌的RPC,使用Protocol Buffers作为序列化协议
主要优点是抽象网络通信细节,简化远程调用
流程:消费者-->代理对象-->请求客户端-->序列化与反序列化-->web服务器-->请求处理-->实现对应类并且调用提供者方法
中间还涉及到服务注册,负载均衡,心跳检查,熔断等操作
go多线程加锁问题
我们想要创建一个安全的计数器,该计数器可以被多个 goroutine 访问和增加,但是需要保证计数器的值不会因为并发访问而出现竞态条件。
import (
"fmt"
"sync"
"time"
)
// MyCounter 结构体包含一个 int 类型的计数器和 sync.Mutex 用于同步
type MyCounter struct {
mu sync.Mutex
value int
}
// Inc 方法用于增加计数器的值,需要加锁以保证线程安全
func (c *MyCounter) Inc() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
// GetValue 方法用于获取当前计数器的值
func (c *MyCounter) GetValue() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.value
}
func main() {
var wg sync.WaitGroup
const numGoroutines = 100 // 启动的 goroutine 数量
const numIncsPerGoroutine = 100 // 每个 goroutine 增加计数器的次数
c := MyCounter{}
// 启动多个 goroutine 来增加计数器
for i := 0; i < numGoroutines; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < numIncsPerGoroutine; j++ {
c.Inc()
}
}()
}
// 等待所有 goroutine 完成
wg.Wait()
// 输出最终的计数器值
fmt.Printf("Final counter value: %d\n", c.GetValue())
time.Sleep(1 * time.Second) // 等待一秒,确保所有输出都完成
}
计算机网络
略
算法
略