Go面试题27
1: 下面这段代码输出什么?
type Direction int
const (
North Direction = iota
East
South
West
)
func (d Direction) String() string {
return [...]string{"North", "East", "South", "West"}[d]
}
func main() {
fmt.Println(South)
}
2: 下面代码输出什么?
type Math struct {
x, y int
}
var m = map[string]Math{
"foo": Math{2,3},
}
func main() {
m["foo"].x = 4
fmt.Println(m["foo"].x)
}
- A.
4
- B.
compilation error
参考答案及解析
1: 答案及解析: South
. 知识点: iota
的用法, 类型的String()
方法.
根据iota
的用法推断出South
的值是3
;另外, 如果类型定义了String
方法, 当使用fmt.Printf(), fmt.Print()
和fmt.Println()
会自动使用String()
方法,实现字符串的打印.
2: 答案及解析: B
, 编译报错 cannot assign to struct field m["foo"].x in map
. 错误原因: 对于类似 x = y
的赋值操作, 必须知道x
的地址,才能够将y
的值赋给x
,但go中map
的value
本身是不可寻址的.
有2个解决办法:
使用临时变量
type Math struct {
x, y int
}
var m = map[string]Math{
"foo": Math{2,3},
}
func main() {
tmp := m["foo"]
tmp.x = 4
m["foo"] = tmp
fmt.Println(m["foo"].x)
}
修改数据结构
type Math struct {
x, y int
}
var m = map[string]*Math{
"foo": &Math{2,3},
}
func main() {
m["foo"].x = 4
fmt.Println(m["foo"].x)
fmt.Printf(""%#v",m["foo"])
}
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付