go语言面试代码题目(不断更新......)

下面代码输出什么:

func main() {

     slice := []int{0,1,2,3}
     m := make(map[int]*int)

     for key,val := range slice {
         m[key] = &val
     }

    for k,v := range m {
        fmt.Println(k,"->",*v)
    }
}

答案:

0 -> 3
1 -> 3
2 -> 3
3 -> 3

原因:在循环中,val 是一个在每次迭代中被重用的变量。因此,每个映射项实际上都引用相同的val的地址,这意味着它们最终都指向切片的最后一个元素。

package main

 import (
     "fmt"
 )

 func main() {
     defer_call()
 }

func defer_call() {
    defer func() { fmt.Println("打印前") }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()
    panic("触发异常")
}
 打印后
打印中
打印前
panic: 触发异常

参考解析:defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic

// 1.
 func main() {
     s := make([]int, 5)
     s = append(s, 1, 2, 3)
     fmt.Println(s)
 }

// 2.
 func main() {
    s := make([]int,0)
    s = append(s,1,2,3,4)
    fmt.Println(s)
}
[0 0 0 0 0 1 2 3]
[1 2 3 4]
  • 下面这段代码有什么缺陷:
func funcMui(x,y int)(sum int,error){
        return x+y,nil
    }

参考答案:第二个返回值没有命名。

参考解析:

在函数有多个返回值时,只要有一个返回值有命名,其他的也必须命名。如果有多个返回值必须加上括号();如果只有一个返回值且命名也必须加上括号()。这里的第一个返回值有命名 sum,第二个没有命名,所以错误。

  • new和make
    new:
    • 用于创建并返回一个指向新分配类型的零值的指针。
    • 不会初始化内存,只是分配零值。
    • 主要用于分配内存给值类型(如结构体、整数、浮点数等)并返回指向该值类型的指针。
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // 使用 new() 创建一个指向结构体 Person 的指针
    p := new(Person)
    fmt.Printf("%#v\n", p) // 输出:&main.Person{Name:"", Age:0}
}

make:

  • 仅用于创建并初始化切片、映射和通道。
  • 用于分配并初始化内部数据结构,返回的是非零值。
  • 主要用于分配引用类型的内存(如切片、映射和通道)。
package main

import "fmt"

func main() {
    // 使用 make() 创建一个切片,并初始化长度为 3
    s := make([]int, 3)
    fmt.Printf("%#v\n", s) // 输出:[]int{0, 0, 0}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值