page contents
Nen
Nen - 程序员

性别: 天津 - 天津市 注册于 2021-06-23

向TA求助
2850金币数
43180 经验值
1个粉丝
主页被访问 6231 次

3096 个回答

0 赞同

init() 函数是什么时候执行的?

init() 函数是 Go 程序初始化的一部分。Go 程序初始化先于 main 函数,由 runtime 初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。 每个包首先初始化包作用域的常量和变量(常量优先于变量),然后执行包的 init() 函数。同一个包,甚至是同一个源文件可以...

回答于 2021-09-10 14:48

0 赞同

Go 语言的局部变量分配在栈上还是堆上?

由编译器决定。Go 语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析(escape analysis),当发现变量的作用域没有超出函数范围,就可以在栈上,反之则必须分配在堆上。 func foo() *int { v := 11 return &v } func main() { m := foo() println(*m) // 11 } foo() 函数中,如果 v 分配在...

回答于 2021-09-10 14:48

0 赞同

2 个 interface 可以比较吗?

Go 语言中,interface 的内部实现包含了 2 个字段,类型 T 和 值 V,interface 可以使用 == 或 != 比较。2 个 interface 相等有以下 2 种情况 两个 interface 均等于 nil(此时 V 和 T 都处于 unset 状态) 类型 T 相同,且对应的值 V 相等。 看下面的例子: type Stu struct { Name string } type StuInt interfa...

回答于 2021-09-10 14:47

0 赞同

两个 nil 可能不相等吗?

可能。 接口(interface) 是对非接口值(例如指针,struct等)的封装,内部实现包含 2 个字段,类型 T 和 值 V。一个接口等于 nil,当且仅当 T 和 V 处于 unset 状态(T=nil,V is unset)。 两个接口值比较时,会先比较 T,再比较 V。 接口值与非接口值比较时,会先将非接口值尝试转换为接口值,再比较。 func main() {...

回答于 2021-09-10 14:47

0 赞同

简述 Go 语言GC(垃圾回收)的工作原理?

最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count),Go 语言采用的是标记清除算法。并在此基础上使用了三色标记法和写屏障技术,提高了效率。 标记清除收集器是跟踪式垃圾收集器,其执行过程可以分成标记(Mark)和清除(Sweep)两个阶段: 标记阶段 — 从根对象出发查找并标记堆中所有存活的对...

回答于 2021-09-10 14:46

0 赞同

函数返回局部变量的指针是否安全?

这在 Go 中是安全的,Go 编译器将会对每个局部变量进行逃逸分析。如果发现局部变量的作用域超出该函数,则不会将内存分配在栈上,而是分配在堆上。

回答于 2021-09-10 14:45

0 赞同

非接口非接口的任意类型 T() 都能够调用 *T 的方法吗?反过来呢...

一个T类型的值可以调用为T类型声明的方法,但是仅当此T的值是可寻址(addressable) 的情况下。编译器在调用指针属主方法前,会自动取此T值的地址。因为不是任何T值都是可寻址的,所以并非任何T值都能够调用为类型T声明的方法。 反过来,一个T类型的值可以调用为类型T声明的方法,这是因为解引用指针总是合法的。事实上,你...

回答于 2021-09-10 14:45

0 赞同

Q1 = 和 := 的区别?

:= 声明+赋值 = 仅赋值 var foo int foo = 10 // 等价于 foo := 10

回答于 2021-09-10 14:45

0 赞同

Q2 指针的作用?

指针用来保存变量的地址。例如 var x = 5var p *int = &xfmt.Printf("x = %d", *p) // x 可以用 *p 访问 •* 运算符,也称为解引用运算符,用于访问地址中的值。•&运算符,也称为地址运算符,用于返回变量的地址。

回答于 2021-09-10 14:44

0 赞同

Go 允许多个返回值吗?

允许 func swap(x, y string) (string, string) {return y, x}func main() { a, b := swap("A", "B") fmt.Println(a, b) // B A}

回答于 2021-09-10 14:44