Go语言题目
1. 为什么有错误?

必须先处理err再defer file.close()
func main() {
file, err := os.Open("test.go")
defer func() {
err := file.Close()
if err != nil {
fmt.Println("close error: ", err)
} else {
fmt.Println("close no error")
}
}()
if err != nil {
fmt.Println("failed", err)
return
}
}
2. GO是调用C代码模块,静态库和动态库
3.HTTP和DNS属于应用层协议,TCP输出传输层协议,IP和ARP属于网络层协议
4.内置类型是可以定义method,但指针类型是不能被定义的
5. golang中大多数数据类型都可以转化为有效的JSON文本,除了channel、complex、函数等
6. 错误设计 ABCD
A
如果失败原因只有一个,则返回bool
B
如果失败原因超过一个,则返回error
C
如果没有失败原因,则不返回bool或error
D
如果重试几次可以避免失败,则不要立即返回bool或error
7.
8. lock() <-> unlock()
Rlock() <-> Runlock()
9. waitgroup 作为函数参数时必须传入waitgroup的指针

10.
双向:var value chan int
单向只读:var value <-chan int
单向只写:var value chan<-int
单向一般用于参数传递和返回值
11. go语言当中字符串是不可变的

输出依然是hello
12. deadlock

for range 就是一直取,goroutine只发了一次,所以循环只转了一下就卡在接受了
13.
指针是引用类型,非基础类型
基础类型:bool、整形、浮点型、复数、string、rune、error;
14. go语言主要通过pprof来检查内存泄露
运行时才能检查内存溢出,比如你程序突然panic
15. receiver 是struct指针类型还是struct的initialize区别
receiver非指针:初始化可以new(),&aaa{},aaa{}
receiver指针: 初始化只能new(),&aaa{}

16. make([]int,5,10) or make([]int,5)
length+capacity length
17. import时写路径名,引用时写包名
18. channel,func,complex不能被json序列化,但小写对包外不可见!!trap
package main
import (
"encoding/json"
"log"
)
type S struct {
A int
B *int
C float64
d func() string
e chan struct{}
}
func main() {
s := S{
A: 1,
B: nil,
C: 12.15,
d: func() string {
return "NowCoder"
},
e: make(chan struct{}),
}
_, err := json.Marshal(s)
if err != nil {
log.Printf("err occurred..")
return
}
log.Printf("everything is ok.")
return
}
19. 全局变量要定义在函数之外,而在函数之外定义的变量只能用var定义
所以str := "” 不能是global variable
20. for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环
高级break:跳出所有循环
package main
import (
"fmt"
)
func main() {
fmt.Println("1")
Exit:
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if i+j > 15 {
fmt.Print("exit")
break Exit
}
}
}
fmt.Println("3")
}
21. code block scope: 在 {} 代码块中的变量a为局部变量,只在 {} 中有效
package main
import "fmt"
func main() {
a := 12
{
a := 13
_ = a // make compiler happy
}
fmt.Println(a)
}
output: 12
22 .panic需要等defer结束后才会向上传递。出现panic的时候,会先按照defer的后进先出的顺序执行,最后才会执行panic。
也就是说panic出现的时候要按照顺序把defer执行完,直到被recover才会终止其他协程
23. go的bool和int不能强制转换
24. string default是"",不能赋值nil

25. channel,slice,map,只有slice 可以动态扩容,channel 和 map 都需要先 make。
成立
26.chan <- 不对,必须 chan <- value
27. init() 不能被显式调用
28. assertion:

类型断言之后,如果成功,那么对象的类型就为断言类型。如这里的integer
无法自动转成*Integer
29. go语言自带垃圾回收器,使用三色标记清除法作为gc机制
30. go的哲学就是舍弃健全的异常机制,追求性能和开发效率,以及快速试错
-在程序开发阶段,坚持速错,让程序异常崩溃
31. interface
A:拥有相同方法列表,那么两个接口实质上同一个接口
B:A是B的子集,意味着A的方法B中都有,那么A是B的基类,所以A=B是可行的
C:接口是否能够调用成功是需要运行的时候才能知道
D:接口赋值是否可行在编译阶段就可以知道
( 在接口类型进行赋值操作时,若类型不匹配,则编辑器就会提示错误,因此接口赋值操作是在编译期确定的
* 而接口类型查询(断言操作),编译器是不会提示错误的,因此需要等到运行期才能确定。)
32. delete只能用于map
slice可以通过append方式实现元素的删除。例如 slice1 = append(slice1[:idx], slice1[idx+1:])
33. select面向channel的IO操作
A "select" statement chooses which of a set of possible send or receive operations will proceed
34. golang no heritance and overriding
import "fmt" type People struct{} func (p *People) ShowA() { fmt.Println("showA") p.ShowB() } func (p *People) ShowB() { fmt.Println("showB") } type Teacher struct { People } func (t *Teacher) ShowB() { fmt.Println("teacher showB") } func main() { t := Teacher{} t.ShowA() println("---") t.ShowB() }
result:
showA
showB
teacher showB
35. golang 在多个case都ok的情况下会公平的选一个

浙公网安备 33010602011771号