当前位置: 首页 > news >正文

淘宝网站开发技术名称网站建设条例

淘宝网站开发技术名称,网站建设条例,长春网站建设网诚传媒,怎么用FTP做网站✍个人博客#xff1a;Pandaconda-CSDN博客 #x1f4e3;专栏地址#xff1a;http://t.csdnimg.cn/UWz06 #x1f4da;专栏简介#xff1a;在这个专栏中#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话#xff0c;欢迎点赞#x1f44d;收藏…  ✍个人博客Pandaconda-CSDN博客 专栏地址http://t.csdnimg.cn/UWz06 专栏简介在这个专栏中我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话欢迎点赞收藏您的支持就是我创作的最大动力 36. Go Ma p 遍历为什么是无序的 使用 range 多次遍历 map 时输出的 key 和 value 的顺序可能不同。这是 Go 语言的设计者们有意为之旨在提示开发者们Go 底层实现并不保证 map 遍历顺序稳定请大家不要依赖 range 遍历结果顺序。 主要原因有 2 点 map 在遍历时并不是从固定的 0 号 bucket 开始遍历的每次遍历都会从一个随机值序号的 bucket再从其中随机的 cell 开始遍历。 map 遍历时是按序遍历 bucket同时按需遍历 bucket 中和其 overflow bucket 中的 cell。但是 map 在扩容后会发生 key 的搬迁这造成原来落在一个 bucket 中的 key搬迁后有可能会落到其他 bucket 中了从这个角度看遍历 map 的结果就不可能是按照原来的顺序了。 map 本身是无序的且遍历时顺序还会被随机化如果想顺序遍历 map需要对 map key 先排序再按照 key 的顺序遍历 map。 func TestMapRange(t *testing.T) {m : map[int]string{1: a, 2: b, 3: c}t.Log(first range:)for i, v : range m {t.Logf(m[%v]%v , i, v)}t.Log(second range:)for i, v : range m {t.Logf(m[%v]%v , i, v)}// 实现有序遍历var sl []int// 把 key 单独取出放到切片for k : range m {sl append(sl, k)}// 排序切片sort.Ints(sl)// 以切片中的 key 顺序遍历 map 就是有序的了for _, k : range sl {t.Log(k, m[k])} } 37. G o Map 为什么是非线程安全的 map 默认是并发不安全的同时对 map 进行并发读写时程序会 panic原因如下 Go 官方在经过了长时间的讨论后认为 Go map 更应适配典型使用场景不需要从多个 goroutine 中进行安全访问而不是为了小部分情况并发访问导致大部分程序付出加锁代价性能决定了不支持。 场景: 2 个协程同时读和写以下程序会出现致命错误fatal error: concurrent map writes package mainimport (fmttime )func main() {s : make(map[int]int)for i : 0; i 100; i {go func(i int) {s[i] i}(i)}for i : 0; i 100; i {go func(i int) {fmt.Printf(map第%d个元素值是%d, i, s[i])}(i)}time.Sleep(1 * time.Second) } 如果想实现 map 线程安全有两种方式 1. 使用读写锁 map sync.RWMutex package mainimport (fmtsynctime )func main() {var lock sync.RWMutexs : make(map[int]int)for i : 0; i 100; i {go func(i int) {lock.Lock()s[i] ilock.Unlock()}(i)}for i : 0; i 100; i {go func(i int) {lock.RLock()fmt.Printf(map第%d个元素值是%d , i, s[i])lock.RUnlock()}(i)}time.Sleep(1 * time.Second) } 2. 使用 Go 提供的 sync.Map  package mainimport (fmtsynctime )func main() {var m sync.Mapfor i : 0; i 100; i {go func(i int) {m.Store(i, i)}(i)}for i : 0; i 100; i {go func(i int) {v, ok : m.Load(i)fmt.Printf(Load: %v, %v , v, ok)}(i)}time.Sleep(1 * time.Second) } 38. G o map 和 sync.Map 谁的性能好为什么 Go 语言的 sync.Map 支持并发读写采取 “空间换时间” 的机制冗余了两个数据结构分别是read 和 dirty。 type Map struct {mu Mutexread atomic.Value // readOnlydirty map[interface{}]*entrymisses int } 对比原始 map 和原始 map RWLock 的实现并发的方式相比减少了加锁对性能的影响。它做了一些优化可以无锁访问 read map而且会优先操作 read map倘若只操作 read map 就可以满足要求那就不用去操作 write map (dirty)所以在某些特定场景中它发生锁竞争的频率会远远小于 map RWLock 的实现方式。 优点 适合读多写少的场景。 缺点 写多的场景会导致 read map 缓存失效需要加锁冲突变多性能急剧下降。 39. 介绍一下 Channel 在 Go 语言中Channel通道是用于多个 Goroutine 之间进行通信的一种机制通过它们可以安全地传递数据。 Channel 是一种类型可以使用内置的 make() 函数来创建它们。创建 Channel 时需要指定它们可以传输的数据类型。 使用 Channel 时可以在 Goroutine 之间传递数据通过它们可以进行同步和异步的操作。在使用 Channel 时需要注意以下几点 Channel 是引用类型可以像 Slice 和 Map 一样传递给函数。 默认情况下Channel 是无缓冲的只有当有 Goroutine 准备好接收数据时发送操作才会成功。如果发送操作没有被接收发送的 Goroutine 将会阻塞。 通过 make() 函数创建带缓冲的 Channel 时可以指定缓冲区的大小。在缓冲区没有被填满之前发送操作不会阻塞。 Channel 支持多路复用可以使用 select 语句在多个 Channel 上进行选择和等待。 Channel 可以用于控制 Goroutine 的执行例如通过关闭 Channel 来通知 Goroutine 退出。 使用 Channel 可以帮助解决并发编程中的一些常见问题例如避免竞态条件、协调不同 Goroutine 之间的操作等。 40. Go channel 的底层实现原理 概念 Go 中的 channel 是一个队列遵循先进先出的原则负责协程之间的通信Go 语言提倡不要通过共享内存来通信而要通过通信来实现内存共享CSP (Communicating Sequential Process) 并发模型就是通过 goroutine 和 channel 来实现的 使用场景 停止信号监听 定时任务 生产方和消费方解耦 控制并发数 底层数据结构 通过 var 声明或者 make 函数创建的 channel 变量是一个存储在函数栈帧上的指针占用 8 个字节指向堆上的 hchan 结构体。 源码包中 src/runtime/chan.go 定义了 hchan 的数据结构 hchan 结构体 type hchan struct {closed uint32 // channel是否关闭的标志elemtype *_type // channel中的元素类型// channel分为无缓冲和有缓冲两种。// 对于有缓冲的channel存储数据使用了 ring buffer环形缓冲区) 来缓存写入的数据本质是循环数组// 为啥是循环数组普通数组不行吗普通数组容量固定更适合指定的空间弹出元素时普通数组需要全部都前移// 当下标超过数组容量后会回到第一个位置所以需要有两个字段记录当前读和写的下标位置buf unsafe.Pointer // 指向底层循环数组的指针环形缓冲区qcount uint // 循环数组中的元素数量dataqsiz uint // 循环数组的长度elemsize uint16 // 元素的大小sendx uint // 下一次写下标的位置recvx uint // 下一次读下标的位置// 尝试读取channel或向channel写入数据而被阻塞的goroutinerecvq waitq // 读等待队列sendq waitq // 写等待队列lock mutex //互斥锁保证读写channel时不存在并发竞争问题 } 等待队列 双向链表包含一个头结点和一个尾结点。 每个节点是一个 sudog 结构体变量记录哪个协程在等待等待的是哪个 channel等待发送/接收的数据在哪里。 type waitq struct {first *sudoglast *sudog } type sudog struct {g *gnext *sudogprev *sudogelem unsafe.Pointerc *hchan... } 操作 创建 使用 make(chan T, cap) 来创建 channelmake 语法会在编译时转换为 makechan64 和 makechan。 func makechan64(t *chantype, size int64) *hchan {if int64(int(size)) ! size {panic(plainError(makechan: size out of range))}return makechan(t, int(size)) } 创建 channel 有两种一种是带缓冲的 channel一种是不带缓冲的 channel。 // 带缓冲 ch : make(chan int, 3) // 不带缓冲 ch : make(chan int) 创建时会做一些检查: 元素大小不能超过 64K。 元素的对齐大小不能超过 maxAlign 也就是 8 字节。 计算出来的内存是否超过限制。 创建时的策略: 如果是无缓冲的 channel会直接给 hchan 分配内存。 如果是有缓冲的 channel并且元素不包含指针那么会为 hchan 和底层数组分配一段连续的地址。 如果是有缓冲的 channel并且元素包含指针那么会为 hchan 和底层数组分别分配地址。 发送 发送操作编译时转换为 runtime.chansend 函数。 func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool 阻塞式 调用 chansend 函数并且 block true。 ch - 10 非阻塞式 调用 chansend 函数并且 block false。 select {case ch - 10:...default } 向 channel 中发送数据时大概分为两大块检查和数据发送数据发送流程如下 如果 channel 的读等待队列存在接收者 goroutine 将数据直接发送给第一个等待的 goroutine 唤醒接收的 goroutine。 如果 channel 的读等待队列不存在接收者 goroutine 如果循环数组 buf 未满那么将会把数据发送到循环数组 buf 的队尾。 如果循环数组 buf 已满这个时候就会走阻塞发送的流程将当前 goroutine 加入写等待队列并挂起等待唤醒。 接收 发送操作编译时转换为runtime.chanrecv函数。 func chanrecv(c *hchan, ep unsafe.Pointer, block bool) (selected, received bool) 阻塞式 调用 chanrecv 函数并且 block true。 ch v : ch v, ok : ch // 当channel关闭时for循环会自动退出无需主动监测channel是否关闭可以防止读取已经关闭的channel,造成读到数据为通道所存储的数据类型的零值 for i : range ch {fmt.Println(i) } 非阻塞式 调用 chanrecv 函数并且 block false。 select {case -ch:...default } 向 channel 中接收数据时大概分为两大块检查和数据发送而数据接收流程如下 如果 channel 的写等待队列存在发送者 goroutine 如果是无缓冲 channel直接从第一个发送者 goroutine 那里把数据拷贝给接收变量唤醒发送的 goroutine。 如果是有缓冲 channel已满将循环数组 buf 的队首元素拷贝给接收变量将第一个发送者 goroutine 的数据拷贝到 buf 循环数组队尾唤醒发送的 goroutine。 如果 channel 的写等待队列不存在发送者 goroutine 如果循环数组 buf 非空将循环数组 buf 的队首元素拷贝给接收变量。 如果循环数组 buf 为空这个时候就会走阻塞接收的流程将当前 goroutine 加入读等待队列并挂起等待唤醒。 关闭 关闭操作调用 close 函数编译时转换为 runtime.closechan 函数。 close(ch) func closechan(c *hchan) 案例分析 package main import (fmttimeunsafe ) func main() {// ch是长度为4的带缓冲的channel// 初始hchan结构体重的buf为空sendx和recvx均为0ch : make(chan string, 4)fmt.Println(ch, unsafe.Sizeof(ch))go sendTask(ch)go receiveTask(ch)time.Sleep(1 * time.Second) } // G1是发送者 // 当G1向ch里发送数据时首先会对buf加锁然后将task存储的数据copy到buf中然后sendx然后释放对buf的锁 func sendTask(ch chan string) {taskList : []string{this, is, a, demo}for _, task : range taskList {ch - task //发送任务到channel} } // G2是接收者 // 当G2消费ch的时候会首先对buf加锁然后将buf中的数据copy到task变量对应的内存里然后recvx,并释放锁 func receiveTask(ch chan string) {for {task : -ch //接收任务fmt.Println(received, task) //处理任务} } 总结 hchan 结构体的主要组成部分有四个 用来保存 goroutine 之间传递数据的循环数组buf 用来记录此循环数组当前发送或接收数据的下标值sendx 和 recvx 用于保存向该 chan 发送和从该 chan 接收数据被阻塞的 goroutine 队列 sendq 和 recvq 保证 channel 写入和读取数据时线程安全的锁lock
文章转载自:
http://www.morning.chfxz.cn.gov.cn.chfxz.cn
http://www.morning.mslhq.cn.gov.cn.mslhq.cn
http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn
http://www.morning.zkqsc.cn.gov.cn.zkqsc.cn
http://www.morning.nydgg.cn.gov.cn.nydgg.cn
http://www.morning.cwqrj.cn.gov.cn.cwqrj.cn
http://www.morning.qgqck.cn.gov.cn.qgqck.cn
http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn
http://www.morning.znqfc.cn.gov.cn.znqfc.cn
http://www.morning.rylr.cn.gov.cn.rylr.cn
http://www.morning.cmhkt.cn.gov.cn.cmhkt.cn
http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn
http://www.morning.xfcjs.cn.gov.cn.xfcjs.cn
http://www.morning.sjwqr.cn.gov.cn.sjwqr.cn
http://www.morning.xcfmh.cn.gov.cn.xcfmh.cn
http://www.morning.rqckh.cn.gov.cn.rqckh.cn
http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn
http://www.morning.pangucheng.cn.gov.cn.pangucheng.cn
http://www.morning.jfqqs.cn.gov.cn.jfqqs.cn
http://www.morning.rnkq.cn.gov.cn.rnkq.cn
http://www.morning.npmcf.cn.gov.cn.npmcf.cn
http://www.morning.snnb.cn.gov.cn.snnb.cn
http://www.morning.hfnbr.cn.gov.cn.hfnbr.cn
http://www.morning.ltkms.cn.gov.cn.ltkms.cn
http://www.morning.bchgl.cn.gov.cn.bchgl.cn
http://www.morning.tqjks.cn.gov.cn.tqjks.cn
http://www.morning.hzqjgas.com.gov.cn.hzqjgas.com
http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn
http://www.morning.lbfgq.cn.gov.cn.lbfgq.cn
http://www.morning.nkjjp.cn.gov.cn.nkjjp.cn
http://www.morning.bqwnp.cn.gov.cn.bqwnp.cn
http://www.morning.lpskm.cn.gov.cn.lpskm.cn
http://www.morning.twwts.com.gov.cn.twwts.com
http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn
http://www.morning.nppml.cn.gov.cn.nppml.cn
http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn
http://www.morning.qydgk.cn.gov.cn.qydgk.cn
http://www.morning.qstjr.cn.gov.cn.qstjr.cn
http://www.morning.xnfg.cn.gov.cn.xnfg.cn
http://www.morning.bpmth.cn.gov.cn.bpmth.cn
http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn
http://www.morning.bszmy.cn.gov.cn.bszmy.cn
http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn
http://www.morning.bfnbn.cn.gov.cn.bfnbn.cn
http://www.morning.brtxg.cn.gov.cn.brtxg.cn
http://www.morning.jzfxk.cn.gov.cn.jzfxk.cn
http://www.morning.lcxzg.cn.gov.cn.lcxzg.cn
http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn
http://www.morning.trtxt.cn.gov.cn.trtxt.cn
http://www.morning.thbkc.cn.gov.cn.thbkc.cn
http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn
http://www.morning.pypqf.cn.gov.cn.pypqf.cn
http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn
http://www.morning.mgskc.cn.gov.cn.mgskc.cn
http://www.morning.wmglg.cn.gov.cn.wmglg.cn
http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn
http://www.morning.kqgsn.cn.gov.cn.kqgsn.cn
http://www.morning.qyrnp.cn.gov.cn.qyrnp.cn
http://www.morning.wrbf.cn.gov.cn.wrbf.cn
http://www.morning.kyjpg.cn.gov.cn.kyjpg.cn
http://www.morning.cyysq.cn.gov.cn.cyysq.cn
http://www.morning.sqmlw.cn.gov.cn.sqmlw.cn
http://www.morning.ksqyj.cn.gov.cn.ksqyj.cn
http://www.morning.bpmtz.cn.gov.cn.bpmtz.cn
http://www.morning.kzhgy.cn.gov.cn.kzhgy.cn
http://www.morning.tpdg.cn.gov.cn.tpdg.cn
http://www.morning.lwnwl.cn.gov.cn.lwnwl.cn
http://www.morning.ygxf.cn.gov.cn.ygxf.cn
http://www.morning.dqpnd.cn.gov.cn.dqpnd.cn
http://www.morning.fmznd.cn.gov.cn.fmznd.cn
http://www.morning.hpprx.cn.gov.cn.hpprx.cn
http://www.morning.ykmtz.cn.gov.cn.ykmtz.cn
http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn
http://www.morning.syssdz.cn.gov.cn.syssdz.cn
http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn
http://www.morning.zyndj.cn.gov.cn.zyndj.cn
http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn
http://www.morning.pqqxc.cn.gov.cn.pqqxc.cn
http://www.morning.mdpcz.cn.gov.cn.mdpcz.cn
http://www.morning.drggr.cn.gov.cn.drggr.cn
http://www.tj-hxxt.cn/news/269472.html

相关文章:

  • 网站布局设计什么是软件开发工具
  • iis 添加网站 win7先做产品网站还是app
  • 百盛联合建设集团网站图片模板在线设计制作
  • 临安建设规划局网站泰安中文网站建设电话
  • 中国建设执业资格注册中心网站个人简介网页怎么做
  • 网站搜索引擎优化诊断北京门户企业网站建设
  • 靓号网站开发seo渠道
  • 做导航网站成本wordpress apache内存
  • 优化网站规模公司怎么推广网络营销
  • 不备案网站怎么做淘宝客建设厅投诉网站
  • 做好史志网站建设微信小程序开发者模式
  • 济南微信网站佛山推广优化公司
  • 金属加工网站怎么做有网站了小程序怎么做
  • 做网站编程的待遇成都住建局官网查询入口
  • 四大门户网站个人企业邮箱怎么申请
  • 网站设计相似侵权吗房产网站搭建
  • 08r2 搭建php网站阿里巴巴官网
  • 宿州论坛seo与网站优化
  • 怎么样上传网站资料网站建设与制作教程下载
  • 网站建设980元网站建设完工报告
  • 做自己的网站花多钱南京网站推广哪家便宜
  • 南城网站建设公司报价北京360建筑网
  • 特产网站开发背景建站程序的选择
  • 一键生成广告图网站创建设计SEO优化象客
  • 网站建设公司一月赚多少大型淘宝客返利网站建设
  • 汕头网站制作开发宁晋网站开发搭建
  • 对外网站ipv6建设方案模板安徽全网优化
  • 淘宝接网站开发的活手机能制作游戏吗
  • 做网站的技术关键wordpress资讯cms主题
  • 青海省公路建设服务网站wordpress中文名图片不显示