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

网站设计与开发培训佛山网页设计师

网站设计与开发培训,佛山网页设计师,免费的网站建设开发,设计网站开发费用计入什么科目文章目录 Q1 init() 函数是什么时候执行的#xff1f;Q2 Go 语言的局部变量分配在栈上还是堆上#xff1f;Q3 2 个 interface 可以比较吗#xff1f;Q4 两个 nil 可能不相等吗#xff1f;Q5 简述 Go 语言GC(垃圾回收)的工作原理Q6 函数返回局部变量的指针是否安全#xff… 文章目录 Q1 init() 函数是什么时候执行的Q2 Go 语言的局部变量分配在栈上还是堆上Q3 2 个 interface 可以比较吗Q4 两个 nil 可能不相等吗Q5 简述 Go 语言GC(垃圾回收)的工作原理Q6 函数返回局部变量的指针是否安全Q7 非接口的任意类型 T() 都能够调用 *T 的方法吗反过来呢 Q1 init() 函数是什么时候执行的 init() 函数是 Go 程序初始化的一部分。Go 程序初始化先于 main 函数由 runtime 初始化每个导入的包初始化顺序不是按照从上到下的导入顺序而是按照解析的依赖关系没有依赖的包最先初始化。 每个包首先初始化包作用域的常量和变量常量优先于变量然后执行包的 init() 函数。同一个包甚至是同一个源文件可以有多个 init() 函数。init() 函数没有入参和返回值不能被其他函数调用同一个包内多个 init() 函数的执行顺序不作保证。 一句话总结 import – const – var – init() – main() 示例 package mainimport fmtfunc init() {fmt.Println(init1:, a) }func init() {fmt.Println(init2:, a) }var a 10 const b 100func main() {fmt.Println(main:, a) } // 执行结果 // init1: 10 // init2: 10 // main: 10Q2 Go 语言的局部变量分配在栈上还是堆上 由编译器决定。Go 语言编译器会自动决定把一个变量放在栈还是放在堆编译器会做逃逸分析(escape analysis)当发现变量的作用域没有超出函数范围就可以在栈上反之则必须分配在堆上。 func foo() *int {v : 11return v }func main() {m : foo()println(*m) // 11 }foo() 函数中如果 v 分配在栈上foo 函数返回时v 就不存在了但是这段函数是能够正常运行的。Go 编译器发现 v 的引用脱离了 foo 的作用域会将其分配在堆上。因此main 函数中仍能够正常访问该值。 Q3 2 个 interface 可以比较吗 Go 语言中interface 的内部实现包含了 2 个字段类型 T 和 值 Vinterface 可以使用 或 ! 比较。2 个 interface 相等有以下 2 种情况 两个 interface 均等于 nil此时 V 和 T 都处于 unset 状态类型 T 相同且对应的值 V 相等。 看下面的例子 type Stu struct {Name string }type StuInt interface{}func main() {var stu1, stu2 StuInt Stu{Tom}, Stu{Tom}var stu3, stu4 StuInt Stu{Tom}, Stu{Tom}fmt.Println(stu1 stu2) // falsefmt.Println(stu3 stu4) // true }stu1 和 stu2 对应的类型是 *Stu值是 Stu 结构体的地址两个地址不同因此结果为 false。 stu3 和 stu4 对应的类型是 Stu值是 Stu 结构体且各字段相等因此结果为 true。 Q4 两个 nil 可能不相等吗 可能。 接口(interface) 是对非接口值(例如指针struct等)的封装内部实现包含 2 个字段类型 T 和 值 V。一个接口等于 nil当且仅当 T 和 V 处于 unset 状态TnilV is unset。 两个接口值比较时会先比较 T再比较 V。接口值与非接口值比较时会先将非接口值尝试转换为接口值再比较。 func main() {var p *int nilvar i interface{} pfmt.Println(i p) // truefmt.Println(p nil) // truefmt.Println(i nil) // false }上面这个例子中将一个 nil 非接口值 p 赋值给接口 i此时i 的内部字段为(T*int, Vnil)i 与 p 作比较时将 p 转换为接口后再比较因此 i pp 与 nil 比较直接比较值所以 p nil。 但是当 i 与 nil 比较时会将 nil 转换为接口 (Tnil, Vnil)与i (T*int, Vnil) 不相等因此 i ! nil。因此 V 为 nil 但 T 不为 nil 的接口不等于 nil。 Q5 简述 Go 语言GC(垃圾回收)的工作原理 最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count)Go 语言采用的是标记清除算法。并在此基础上使用了三色标记法和写屏障技术提高了效率。 标记清除收集器是跟踪式垃圾收集器其执行过程可以分成标记Mark和清除Sweep两个阶段 标记阶段 — 从根对象出发查找并标记堆中所有存活的对象清除阶段 — 遍历堆中的全部对象回收未被标记的垃圾对象并将回收的内存加入空闲链表。 标记清除算法的一大问题是在标记期间需要暂停程序Stop the worldSTW标记结束之后用户程序才可以继续执行。为了能够异步执行减少 STW 的时间Go 语言采用了三色标记法。 三色标记算法将程序中的对象分成白色、黑色和灰色三类。 白色不确定对象。灰色存活对象子对象待处理。黑色存活对象。 标记开始时所有对象加入白色集合这一步需 STW 。首先将根对象标记为灰色加入灰色集合垃圾搜集器取出一个灰色对象将其标记为黑色并将其指向的对象标记为灰色加入灰色集合。重复这个过程直到灰色集合为空为止标记阶段结束。那么白色对象即可需要清理的对象而黑色对象均为根可达的对象不能被清理。 三色标记法因为多了一个白色的状态来存放不确定对象所以后续的标记阶段可以并发地执行。当然并发执行的代价是可能会造成一些遗漏因为那些早先被标记为黑色的对象可能目前已经是不可达的了。所以三色标记法是一个 false negative假阴性的算法。 三色标记法并发执行仍存在一个问题即在 GC 过程中对象指针发生了改变。比如下面的例子 A (黑) - B (灰) - C (白) - D (白)正常情况下D 对象最终会被标记为黑色不应被回收。但在标记和用户程序并发执行过程中用户程序删除了 C 对 D 的引用而 A 获得了 D 的引用。标记继续进行D 就没有机会被标记为黑色了A 已经处理过这一轮不会再被处理。 A (黑) - B (灰) - C (白) ↓D (白)为了解决这个问题Go 使用了内存屏障技术它是在用户程序读取对象、创建新对象以及更新对象指针时执行的一段代码类似于一个钩子。垃圾收集器使用了写屏障Write Barrier技术当对象新增或更新时会将其着色为灰色。这样即使与用户程序并发执行对象的引用发生改变时垃圾收集器也能正确处理了。 一次完整的 GC 分为四个阶段 标记准备(Mark Setup需 STW)打开写屏障(Write Barrier)使用三色标记法标记Marking, 并发标记结束(Mark Termination需 STW)关闭写屏障。清理(Sweeping, 并发) Q6 函数返回局部变量的指针是否安全 这在 Go 中是安全的Go 编译器将会对每个局部变量进行逃逸分析。如果发现局部变量的作用域超出该函数则不会将内存分配在栈上而是分配在堆上。 Q7 非接口的任意类型 T() 都能够调用 *T 的方法吗反过来呢 一个T类型的值可以调用为T类型声明的方法但是仅当此T的值是可寻址(addressable) 的情况下。编译器在调用指针属主方法前会自动取此T值的地址。因为不是任何T值都是可寻址的所以并非任何T值都能够调用为类型T声明的方法。反过来一个T类型的值可以调用为类型T声明的方法这是因为解引用指针总是合法的。事实上你可以认为对于每一个为类型 T 声明的方法编译器都会为类型T自动隐式声明一个同名和同签名的方法。 哪些值是不可寻址的呢 字符串中的字节map 对象中的元素slice 对象中的元素是可寻址的slice的底层是数组常量包级别的函数等。 举一个例子定义类型 T并为类型 *T 声明一个方法 hello()变量 t1 可以调用该方法但是常量 t2 调用该方法时会产生编译错误。 type T stringfunc (t *T) hello() {fmt.Println(hello) }func main() {var t1 T ABCt1.hello() // helloconst t2 T ABCt2.hello() // error: cannot call pointer method on t }
http://www.hkea.cn/news/14319387/

相关文章:

  • 杭州网站建设方案优化网站建网站建设设
  • 合肥做网站大概多少钱南宁seo推广经验
  • 南充外贸网站建设网站建设的税率
  • 网站收录怎么删公司变更名字需要什么手续
  • 网站自动弹窗代码莱芜在线论坛莱芜一中李念学
  • 公司制作网站价格合肥画册设计公司
  • 做网站建设怎么跑客户怎么做网站自动响应
  • 泸州大浪科技做网站个人网页的设计与制作价值
  • 网站设计网站类型制作社交网站
  • 营销型网站如何制作安徽省建设部网站
  • 亿景网站建设百度搜索指数排名
  • 石家庄网站优化多少钱请别人做网站有风险吗
  • 公司网站怎么做产品图片什么是网站结构
  • 公司的做网站wordpress 分类 标题
  • 网站建设前期如何规划平台设计方法
  • 软件公司网站素材内蒙古建设工程交易服务中心网站
  • 张家港网站优化从做系统后以前的网站打不开了怎么办
  • 上海市开办企业一窗网上服务seo优化标题 关键词
  • 企业门户网站开发源码管理咨询公司是做什么
  • 做外贸网站市场分析十大农业网站
  • 如何做汽车团购网站asp flash网站模板
  • 自建网站平台可以实现哪些功能网站搭建平台选哪个
  • 做网站页面大小多大做公益网站又什么要求
  • asp.net 大型网站开发个人网站好备案吗
  • 学校做好网站建设目的女排联赛最新排行榜
  • 哪个网站做logo好邯郸大网站
  • 西安 网站建设 费用西丽网站建设设计
  • 外贸网站推广有哪些做电商设计在哪个网站接单
  • 深圳住房和建设局网站 招标专业网站设计开发
  • 网站重新建设的请示网站备案阿里云流程