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

上传键值对,文件

**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) // 等待一秒,确保所有输出都完成
}

计算机网络

算法

相关推荐
JaneYork几秒前
接口设计,接口返回信息,当账号不存在时候,应该返回200还是500,是直接返回R.fail()还是throw exception
java·spring boot
LTPP4 分钟前
自动化 Rust 开发的革命性工具:lombok-macros
前端·后端·github
一个热爱生活的普通人4 分钟前
Go语言中 Mutex 的实现原理
后端·go
Victor3564 分钟前
Dubbo(31)如何优化Dubbo的启动速度?
后端
qianmoq5 分钟前
轻松掌握Java多线程 - 第二章:线程的生命周期
java·后端
Postkarte不想说话6 分钟前
FreeSWITCH与FreeSWITCH对接
后端
孔令飞7 分钟前
关于 LLMOPS 的一些粗浅思考
人工智能·云原生·go
小戴同学7 分钟前
实时系统降低延时的利器
后端·性能优化·go
风象南7 分钟前
Spring Boot 实现文件断点续传
java·spring boot·后端
Cache技术分享7 分钟前
36. Java 控制流语句 Break 语句
前端·后端