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.

  A
switch 中的表达式是可选的,可以省略。如果省略表达式,则相当于 switch true,这种情况下会将每一个 case 的表达式的求值结果与 true 做比较,如果相等,则执行相应的代码。
B
可以在一个 case 中包含多个表达式,每个表达式用逗号分隔。
case "a", "e", "i", "o", "u": //multiple expressions in case
CD
在 Go 中执行完一个 case 之后会立即退出 switch 语句。fallthrough语句用于标明执行完当前 case 语句之后按顺序执行下一个case 语句
fallthrough 会使其强制执行后面的代码!!

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;

复杂类型:array、(slice、pointer、map、chan, func, interface)是引用类型、struct

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的情况下会公平的选一个

posted @ 2023-11-07 14:55  PEAR2020  阅读(162)  评论(0)    收藏  举报