96SEO 2026-02-19 12:14 3
支持高并发#xff0c;go有独特的协程概念#xff0c;一般语言最小的执行单位是线程#xff0c;go语言支持多开协程#xff0c;协程是用户态线程#xff0c;协程的占用内存更少#xff0c;协程只…1.

支持高并发go有独特的协程概念一般语言最小的执行单位是线程go语言支持多开协程协程是用户态线程协程的占用内存更少协程只独有自己的栈等一些资源。
其他都是共享线程的。
调度时可以极大减少上下文切换。
golang在1.11版本之前用的是GOPATH项目代码要放在GOPATH/src目录下才可运行。
但是GOPATH存在弊端没有版本控制概念go
get的外部库自己都不知道下载的什么版本再多人协作开发时无法确定大家的外部库版本是否一致会出大问题。
可以初始化声明所有类型返回的是一个指针类型。
对应的是该类型的空值
不管是有无缓冲channel。
关闭后都可以读读的是channel
用来做协程之间的通信。
go语言提倡不要用共享内存来通信要用通信的方式来共享内存。
channel就是利用通信的方式实现对资源的访问。
channel底层是一个结构体里面包含一个环形缓冲区还有接收等待队列和发送等待队列。
分别存放等待写消息的协程队列和读消息的协程队列还有一个互斥锁用来保证channel的线程安全防止多个协程并发读写。
当一个协程向channel写数据如果是无缓冲通道会将其加入到消息等待发送队列中等待一个协程向channel读数据
读数据时会先看缓冲区如果没有再唤醒消息等待发送队列的第一个协程拿到信息如果没有加入到消息等待接收队列等待一个协程向channel写数据
channel并发安全底层结构体中有一个互斥锁在并发环境下可以自动实现加锁解锁操作。
用slice存放map的key值对slice进行排序然后按照slice顺序查找map
value存放链表节点写入map的时候同时按照顺序写入list中顺序遍历时只需要遍历链表即可。
可以达到有序效果。
value不能取址map不支持这种操作当某种条件达到后map会做增量扩容或者等量扩容操作。
这时候每个key
元素的个数桶的个数以及指向桶数组的指针每一个桶是一个bucketbucket在go中用的是
8个键值对哈希值低八位相同的键存入bucket时会将高八位存储在tophash数组里。
data
valuevaluevalue存放的overflow指针指向下一个bucket桶通过链表将所有冲突的键连接起来。
哪些数据类型不能作为map里面的key哪些可以有没有什么评判标准
最开始的时候大多用线程池开一定量的线程当有工作任务到来时会拿出一个线程处理但当因为发生系统调用而阻塞时线程池中可工作的线程就少了线程池的性能就降低了。
于是有了GMP模型。
全局队列当本地队列都满了新来的G会优先加入本地队列中本地队列满了会把本地队列的一半加入到全局队列
有调度策略线程正常情况下会和P绑定处理P中的本地队列G但当处理G时由于系统调用导致阻塞时会触发hand
解绑把P转移给其他的空闲M如果没有就创建一个新的M处理。
如果M将P中的队列G处理完了就会从其他P的本地队列中偷取一半协程来运行如果其他都没有就会从全局队列中选择一批来处理。
M最多10000个在初始化运行时会设置最大值。
但因为M需要获取到P才能处理GP的数量是很有限的所以M不会很多。
线程数量和程序运行时设置的最大M有关默认是10000并且跟P有关系因为M必须要拿到P才能处理G。
而且如果线程处理的阻塞的G完成后可能会被销毁。
不能无限大
copy方法时或者append触发扩容机制时都是深度拷贝。
拷贝的是数据本身新创建的对象和源对象不共享内存会另开辟一个新的内存地址值修改时不会影响源对象值。
1.18版本之前当切片容量1024之前每次扩容都是原来数组的二倍当切片容量到1024之后每次扩容都是原数组1.25倍
1.18版本觉得扩容比例一下从2变成1.25有些不平滑于是调整扩容机制在容量小于256时是2倍扩容当容量大于256时增加
写一个接口里面有要实现的方法定义一个结构体实现接口中的方法然后初始化时声明一个接口对象并指向具体的结构体这样实现了面向接口编程解耦。
也可以用来做强制类型转换断言。
interface.(type)
go中的继承是通过结构体嵌套实现的子结构体嵌套父结构体。
初始化子结构体后就可以用父结构体的方法。
golang是强类型语言不会隐式的进行数据类型的转换。
在速度上可能略逊弱类型语言但是严谨性又避免了不必要的错误
WaitGroup有三个方法Add,Done,Wait。
用来控制计数器数量。
可以用channel实现goroutine之间通过channel通信如果多个goroutine都写入channel这时候通过缓冲区就可以实现并发控制当缓冲区满时后面的goroutine的写操作会被阻塞。
context类型有哪些Context的作用是什么context如何实现cancel的
context主要用来在协程间传递关闭信号、信息的。
可以控制多级协程
空context、cancelCtx、valueCtx、timerCtx。
cancelCtx可以用来做协程的断开操作。
针对于互斥锁的Mutex。
正常模式下请求锁的协程要按照先入先出顺序排队以此被唤醒唤醒后还要与新请求锁的协程进行竞争因为新请求的协程有优势他们正在CPU上运行或者数量比较多。
新唤醒的协程很难获取到锁于是又会加到队列头部如果一个等待的协程超过1ms仍未获取到锁就会进入到饥饿模式。
饥饿模式下互斥锁所有权会直接从解锁的协程转移到队首的协程并且新到达的协程不会尝试获取锁而是加到队列尾部。
如果一个等待协程获取到锁并且满足下面两个条件只一就会回到正常模式。
是队列的最后一个协程等待时间小于1ms。
1fmt.Println(-ch1)x.Done()}()go
gc是垃圾回收机制为了对堆栈上使用完的对象及时回收。
防止内存溢出。
最初1.3版本之前使用的是标记清除法GC时会暂停程序进行标记清楚操作。
STW时间很长。
为了优化STW1.3版本后缩短了一些STW时间回收对象的操作放在STW时间之外。
1.5版本时为了降低STW的时间使用三色标记法插入/删除屏障实现。
三色标记法是在GC开始时从根节点开始遍历所有可达对象第一次遍历到的对象置灰第二次遍历到的对象置黑。
当没有灰色对象是开始回收对象。
但是这样存在问题当新创建了一个白色对象时被一个黑色对象引用了此时会造成刚创建的对象也被回收。
还有当删除一个对象时但是后面的对象还想要使用但是断掉后后面的对象也会被回收。
针对这两种情况提出了两个设计原则强三色不变式和弱三色不变式强三色强调黑色对象不能引用白色对象。
弱三色不变式强调当黑色对象引用白色对象是要保证还有一个灰色对象引用白色对象。
针对这两个原则产出了插入屏障和删除屏障插入屏障实现的是强三色不变式当黑色对象引用白色对象时会将白色对象变为灰色对象。
删除屏障实现的是弱三色不变式当删除灰色后面的白色对象会把删除的白色对象置灰。
当扫描完没有灰色对象后会将栈对象置白启用STW从新扫描一遍栈上的可达节点最终删掉白色对象。
插入屏障仍然需要re-scan栈上的节点。
删除屏障删除效率低这次要删除的对象要等下次才能删掉。
于是1.8版本后采用三色标记法混合写屏障。
混合写屏障结合了插入和删除屏障的优点栈上的对象不启用GC扫描时会将所有栈上对象和新建对象置黑针对堆上对象所有创建和删除的对象都置灰。
体现的是变形的弱三色不变式。
1.8版本极大减少了STW时间但并不是完全没有因为在GC三色标记法之前还要STW开启辅助GC和写屏障统计根对象的任务数量等。
创建的资源没有正常释放造成内存一直占用。
也无法被GC回收。
内存泄漏一般是程序员申请资源后没有手动去释放资源关闭通道解锁等。
对于指针类型因为分配内存时不知道是否存在外部引用于是就将内存分配在堆中防止函数结束后局部变量被回收。
interface类型上调用方法编译时不知道是如何实现的就会放到堆中。
defer和return知识return分为两步操作第一步先将返回值赋给return在准备返回之前要执行defer函数执行完后才将结果返回。
如果定义了具名返回值并且在defer时对这个变量进行了处理。
那return
这个函数会返回一个通道并且过一段时间后会自动向通道发送一个数据。
方法当到规定时间或超过某一时间后会调用cancel方法来关闭channel。
可以做超时控制
可以在多个通道中选择一个可用的操作来执行如果没有一个通道准备就绪select会执行defaule语句或者继续等待。
从main包开始执行首先会导入引用的包如果这个包里有init函数会先执行这个包的init函数。
如果在main包定义了init函数Go运行会在包导入后全局变量初始化之前调用init函数。
调用之后会进行全局变量初始化操作最终进入到main函数是整个程序入口点。
main函数执行后程序会按照调用函数顺序依次执行其他函数。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback