1. 程式人生 > >Go面試題

Go面試題

12.是否可以編譯通過?如果通過,輸出什麼?

  1. func main() {
  2. i := GetValue()
  3. switch i.(type) {
  4. case int:
  5. println("int")
  6. case string:
  7. println("string")
  8. case interface{}:
  9. println("interface")
  10. default:
  11. println("unknown")
  12. }
  13. }
  14. func GetValue() int {
  15. return 1
  16. }

解析

考點:type

編譯失敗,因為type只能使用在interface

13.下面函式有什麼問題?

  1. func funcMui(x,y int)(sum int
    ,error)
    {
  2. return x+y,nil
  3. }

解析

考點:函式返回值命名在函式有多個返回值時,只要有一個返回值有指定命名,其他的也必須有命名。 如果返回值有有多個返回值必須加上括號; 如果只有一個返回值並且有命名也需要加上括號; 此處函式第一個返回值有sum名稱,第二個未命名,所以錯誤。

14.是否可以編譯通過?如果通過,輸出什麼?

  1. package main
  2. func main() {
  3. println(DeferFunc1(1))
  4. println(DeferFunc2(1))
  5. println(DeferFunc3(1))
  6. }
  7. func DeferFunc1(i int) (t int) {
  8. t = i
  9. defer func() {
  10. t += 3
  11. }()
  12. return t
  13. }
  14. func DeferFunc2(i int) int {
  15. t := i
  16. defer func() {
  17. t += 3
  18. }()
  19. return t
  20. }
  21. func DeferFunc3(i int) (t int) {
  22. defer func() {
  23. t += i
  24. }()
  25. return 2
  26. }

解析

考點:defer和函式返回值需要明確一點是defer需要在函式結束前執行。 函式返回值名字會在函式起始處被初始化為對應型別的零值並且作用域為整個函式 DeferFunc1有函式返回值t作用域為整個函式,在return之前defer會被執行,所以t會被修改,返回4; DeferFunc2函式中t的作用域為函式,返回1; DeferFunc3返回3

15.是否可以編譯通過?如果通過,輸出什麼?

  1. func main() {
  2. list := new([]int)
  3. list = append(list, 1)
  4. fmt.Println(list)
  5. }

解析

考點:newlist:=make([]int,0)

16.是否可以編譯通過?如果通過,輸出什麼?

  1. package main
  2. import "fmt"
  3. func main() {
  4. s1 := []int{1, 2, 3}
  5. s2 := []int{4, 5}
  6. s1 = append(s1, s2)
  7. fmt.Println(s1)
  8. }

解析

考點:appendappend切片時候別漏了'...'

17.是否可以編譯通過?如果通過,輸出什麼?

  1. func main() {
  2. sn1 := struct {
  3. age int
  4. name string
  5. }{age: 11, name: "qq"}
  6. sn2 := struct {
  7. age int
  8. name string
  9. }{age: 11, name: "qq"}
  10. if sn1 == sn2 {
  11. fmt.Println("sn1 == sn2")
  12. }
  13. sm1 := struct {
  14. age int
  15. m map[string]string
  16. }{age: 11, m: map[string]string{"a": "1"}}
  17. sm2 := struct {
  18. age int
  19. m map[string]string
  20. }{age: 11, m: map[string]string{"a": "1"}}
  21. if sm1 == sm2 {
  22. fmt.Println("sm1 == sm2")
  23. }
  24. }

解析

考點:結構體比較進行結構體比較時候,只有相同型別的結構體才可以比較,結構體是否相同不但與屬性型別個數有關,還與屬性順序相關。

  1. sn3:= struct {
  2. name string
  3. age int
  4. }{age:11,name:"qq"}

sn3與sn1就不是相同的結構體了,不能比較。 還有一點需要注意的是結構體是相同的,但是結構體屬性中有不可以比較的型別,如map,slice。 如果該結構屬性都是可以比較的,那麼就可以使用“==”進行比較操作。

可以使用reflect.DeepEqual進行比較

  1. if reflect.DeepEqual(sn1, sm) {
  2. fmt.Println("sn1 ==sm")
  3. }else {
  4. fmt.Println("sn1 !=sm")
  5. }

所以編譯不通過: invalid operation: sm1 == sm2

18.是否可以編譯通過?如果通過,輸出什麼?

  1. func Foo(x interface{}) {
  2. if x == nil {
  3. fmt.Println("empty interface")
  4. return
  5. }
  6. fmt.Println("non-empty interface")
  7. }
  8. func main() {
  9. var x *int = nil
  10. Foo(x)
  11. }

解析

考點:interface內部結構

  1. non-empty interface

19.是否可以編譯通過?如果通過,輸出什麼?

  1. func GetValue(m map[int]string, id int) (string, bool) {
  2. if _, exist := m[id]; exist {
  3. return "存在資料", true
  4. }
  5. return nil, false
  6. }
  7. func main() {
  8. intmap:=map[int]string{
  9. 1:"a",
  10. 2:"bb",
  11. 3:"ccc",
  12. }
  13. v,err:=GetValue(intmap,3)
  14. fmt.Println(v,err)
  15. }

解析

考點:函式返回值型別nil 可以用作 interface、function、pointer、map、slice 和 channel 的“空值”。但是如果不特別指定的話,Go 語言不能識別型別,所以會報錯。報:cannot use nil as type string in return argument.

20.是否可以編譯通過?如果通過,輸出什麼?

  1. const (
  2. x = iota
  3. y
  4. z = "zz"
  5. k
  6. p = iota
  7. )
  8. func main() {
  9. fmt.Println(x,y,z,k,p)
  10. }

解析

考點:iota結果:

0 1 zz zz 4