Golang面试精编1

简单介绍一下Golang?

  • 谷歌开发的一种系统编程语言;
  • 它具有内置的垃圾收集机制;
  • 支持高并发;
  • 代码可以编译成单个可执行二进制文件,不需要添加库或运行时环境即可在服务器上执行;
Golang是否可以声明一个类?
  • 可以,type Person struct{…}
Go是否支持泛型?(陷阱问题)
  • 否,泛型是方便的,但是它们在类型系统和运行时的复杂性方面付出了代价。
  • Go语言的解决方案就是使用interface{}替代任意类型,简单有效;
  • TODO:拓展一下泛型的概念
从GitHub或者bitbucket导入代码的命令是什么?
  • go get和go install命令
比较一下go run/build/get/install几个命令的异同?
  • go run xxx.go:直接编译并运行go文件,产生的可执行程序在临时文件夹中;
  • go build xxx.go:在当前目录产生同名的可执行程序;
  • go get mypack:下载包源码到当前GOPATH/src目录下;
  • go install mypack:对指定包进行编译安装;
    如果mypack是一个类库包,则在当前GOPATH/pkg下生成对应的包文件,
    如果mypack是一个含有main主程序的包,则在当前GOPATH/bin下生成可执行程序;
一个通过make()命令创建的缓冲区被分配了一块内存后。如何销毁缓冲区并收回内存?
  • buffer = nil
    在运行时,buffer = nil将启动垃圾回收。
  • make()能创建的类型包括:切片,map,管道,三者都是引用类型;(追问:Go语言的引用类型)
  • 引用类型的值的内存分配是在堆中的,栈中使用一个地址指向之;
    需要回收时,将栈中的指针/引用指向即可nil;
  • TODO:拓展一下堆栈内存分配
切片和数组的显著差异是什么?
  • 数组大小是固定的,切片大小不是。
  • 切片在运行时可以动态地增加或减少切片的大小,但数组不可以。
  • 使用了内置的添加、复制功能对切片操作。
  • 追问:切片的双倍扩容机理
cap()和len()函数的区别是什么?
  • len()返回切片中的元素个数。
  • cap()返回切片的容量即切片可以容纳的元素数量。
【Golang面试精编1】哈希表或哈希映射允许快速查找。GO如何实现哈希映射?(陷阱问题)
  • 哈希表在Golang中相当于map,也就是哈希映射。
    hash_table := make(map[string]string)

    推荐阅读