Bootstrap

【Go面试】基础八股文篇 (持续整合)

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:**表单数据

上传键值对,文件

image-20250112204154435

**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.在主协程上打印

// 传递自定义结构体的 Channel
type Message struct {
    Content string
    Sender  string
}

msgCh := make(chan Message)
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) // 等待一秒,确保所有输出都完成
}

计算机网络

算法

;