下面代码能编译通过吗? #
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