面试题1

下面代码能编译通过吗? #

package main
import "fmt"
func main()
{
	fmt.Println("hello world")
}
答: 不能,报语法错误:syntax error: unexpected semicolon or newline before {
    因为go语言中,左大括号不能单独一行,包括if,switch,for等语法的都一样
}

下面代码能编译通过吗? #

package main
func main() {
	a := 3
}
答:不能,报变量未使用错误:a declared and not used
解决办法:
    方案1: _ = a //推荐使用这种方式
    方案2:fmt.Println(a)
    方案3:删除 a := 3这行代码

下面代码能否正确执行?如果正确执行打印什么? #

package main
import "fmt"
func main()  {
	var b *int  //仅声明,还未分配空间,值为nil,不能直接赋值
        *b = 12
        fmt.Println(*b)
}
答:以上代码不能正常执行,会报语法错误:panic: runtime error: invalid memory address or nil pointer dereference
  解决办法:
      办法1:为变量分配空间后再赋值:b = new(int); *b = 12
      办法2:声明同时分配空间:var b *int = new(int) 

下面代码能否正确执行?如果正确执行打印什么? #

package main
import "fmt"
func main()  {
	var b map[string]int 
	    b["admin"] = 100
	fmt.Println(b)
}
答:会报语法错误:panic: assignment to entry in nil map
    解决办法:
        办法1: 声明map变量并分配空间:var b map[string]int = make(map[string]int)
        办法2: 为变量赋值前先分配空间:b = make(map[string]int);b["admin"] = 100

下面这段代码输出什么? #

package main

import "fmt"
func main()  {
	var x = nil
	fmt.Println(x)
}
答:报语法错误: use of untyped nil
    因为x变量的类型不确定且接收一个任意类型的值,无法退出x变量类型
    解决办法: 声明变量x为指针类型,如:var x *int = nil 此时再打印则输出<nil>

下面这段代码输出什么? #

package main
import "fmt"
func main() {
	var x = []int{6:66, 3, 4, 0:11, 5}
	fmt.Println(x)
}
答: 输出 [11 5 0 0 0 0 66 3 4]
    因为切片指定索引下标赋值,没有指定索引下标的元素在前一个索引下标的基础之上加1

下面这段代码输出什么? #

package main
import "fmt"
func incr(p *int) int  {
	*p++
	return *p
}
func main() {
	x := 3
	incr(&x)
	fmt.Println(x)
}
答: 4,因为指针类型按引用传递

new()和make()函数的区别 #

答:
相同点:分配内存并初始化值,不同点:返回值类型不同
1. func make(t Type, size ...IntegerType) Type 用于分配内存并初始化值,返回切片、map、chan类型变量
    a := make([]int, 12, 12)
    fmt.Println(a) //[0 0 0 0 0 0 0 0 0 0 0 0]
2. func new(Type) *Type 返回指针类型
    a := new(int)
    fmt.Println(*a) //0

func make(t Type, size ...IntegerType) Type
    make(切片类型,长度) a := make([]int, 5)
    make(切片类型,长度,cap容量) b := make([]int, 12, 12)
    make(map类型)  c := make(map[string]string)
    make(map类型, 初始化元素个数) d := make(map[string]string, 3)
    make(chan类型) e := make(chan string)
    make(chan类型, 缓冲长度) f := make(chan string, 10)

func new(Type) *Type

len(变量名)方法的用途有哪些? #

答:1.获取字符串长度
    2.获取数组长度
    3.获取切片大小
    4.map变量长度,即key的个数

下面这段代码输出什么? #

package main
import "fmt"
func swap(a, b *int) {
	b, a = a, b
}
func main() {
	x, y := 1, 2
	swap(&x, &y)
	fmt.Println(x, y) //1 2
	x=5
	fmt.Println(x, y) //5 2
}
答: 输出1 2
        5 2
因为:虽然swap函数接收的是指针变量,引用传递,但在swap函数内只交换了地址,没有变更值,因此不影响x,y的实际值

package main
import "fmt"
func swap(a, b *int) {
	b, a = a, b
	*b = 6  //修改指针值,其实就是修改原来a变量的值
}
func main() {
	x, y := 1, 2
	swap(&x, &y)
	fmt.Println(x, y) //6 2
	x=5
	fmt.Println(x, y) //5 2
}
答: 输出6 2
        5 2
Build by Loppo 0.6.15