Go 中文网、思否、博客园等平台,内容主要以问答形式记录。如果回答中有错误,欢迎大家指出,共同学习、共同进步。
Go每日一题_081
以下代码输出什么? package main import ( "fmt" ) func main() { var ans float64 = 15 + 25 + 5.2 fmt.Println(ans) } A:不能编译;B:45;C:45.2;D:45.0 🔑 答案解析: C 数字是无类型常量 或者说是任意类型
Go 中文网、思否、博客园等平台,内容主要以问答形式记录。如果回答中有错误,欢迎大家指出,共同学习、共同进步。
以下代码输出什么? package main import ( "fmt" ) func main() { var ans float64 = 15 + 25 + 5.2 fmt.Println(ans) } A:不能编译;B:45;C:45.2;D:45.0 🔑 答案解析: C 数字是无类型常量 或者说是任意类型
下面 A、B 两处应该填入什么代码,才能确保顺利打印出结果? type S struct { m string } func f() *S { return __ //A } func main() { p := __ //B fmt.Println(p.m) //print "foo" } 🔑 答案解析: A. &S{“foo”} B. *f() 或者 f() f() 函数返回参数是指针类型,所以可以用 & 取结构体的指针;B 处,如果填 f(),则 p 是 S 类型;如果填 f(),则 p 是S 类型,不过都可以使用 p.m 取得结构体的成员。
A、B、C、D 哪些选项有语法错误? type S struct { } func f(x interface{}) { } func g(x *interface{}) { } func main() { s := S{} p := &s f(s) //A g(s) //B f(p) //C g(p) //D } 🔑 答案解析: 参考答案及解析:BD。 函数参数为 interface{} 时可以接收任何类型的参数,包括用户自定义类型等,即使是接收指针类型也用 interface{},而不是使用 *interface{}。 永远不要使用一个指针指向一个接口类型,因为它已经是一个指针。
下面的两个切片声明中有什么区别?哪个更可取? A. var a []int B. a := []int{} 🔑 答案解析: A 声明的 []int 未初始化 指向的nil B 声明的 []int 是已经初始化的 指向的内容为空的数组。 A 可以写到全局 B 只能写到函数内 A 与 B 占用的内存空间理论上是相同的。 注意:空切片empty slice 指向了一个固定地址,所以实际上确实没有分配内存。 但是B比A 多指向的内容为空的数组,这个操作也会消耗而外性能(🤏),在性能的角度上A具有优势
下面代码输出什么? type Person struct { age int } func main() { person := &Person{28} // 1. defer fmt.Println(person.age) // 2. defer func(p *Person) { fmt.Println(p.age) }(person) // 3. defer func() { fmt.Println(person.age) }() person = &Person{29} } 🔑 答案解析: 29 28 28 注意// 2 这里传入的person指向的地址 与后面person = &Person{29}后person 指向的地址不同
下面这段代码正确的输出是什么? func f() { defer fmt.Println("D") fmt.Println("F") } func main() { f() fmt.Println("M") } 🔑 答案解析: FDM
下面代码段输出什么? type Person struct { age int } func main() { person := &Person{28} // 1. defer fmt.Println(person.age) // 2. defer func(p *Person) { fmt.Println(p.age) }(person) // 3. defer func() { fmt.Println(person.age) }() person.age = 29 } 🔑 答案解析: 29 29 28 defer是先进后出的 因此会运行 // 3 的内容 输出29 后运行 //2 这里传入的是指针类型,因此会数据也是29 最后运行//1 因为入参的值在运行defer就已经定下来了 因此输出28
以下代码输出什么? package main import "fmt" func app() func(string) string { t := "Hi" c := func(b string) string { t = t + " " + b return t } return c } func main() { a := app() b := app() a("go") fmt.Println(b("All")) fmt.Println(a("All")) } A:Hi All;B:Hi go All;C:Hi;D:go Al 🔑 答案解析: 闭包 fmt.Println(b(“All”)) 输出 A (Hi All) fmt.Println(a(“All”)) 输出 B (Hi go All)
f1()、f2()、f3() 函数分别返回什么? func f1() (r int) { defer func() { r++ }() return 0 } func f2() (r int) { t := 5 defer func() { t = t + 5 }() return t } func f3() (r int) { defer func(r int) { r = r + 5 }(r) return 1 } 🔑 答案解析: f1 1 f2 5 f3 1
下面代码输出什么? type A interface { ShowA() int } type B interface { ShowB() int } type Work struct { i int } func (w Work) ShowA() int { return w.i + 10 } func (w Work) ShowB() int { return w.i + 20 } func main() { var a A = Work{3} s := a.(Work) fmt.Println(s.ShowA()) fmt.Println(s.ShowB()) } A. 13 23 B. compilation error 🔑 答案解析: A :类型断言。 无坑