Golang基础语法考察

Golang语法相关

1.结构体序列化

1.(单选)以下代码,会发生什么

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type S struct {
    A int
    B *int
    C float64
    d func() string
    e chan struct{}
}
func main() {
    s := S{
       A: 1,
       B: nil,
       C: 12.15,
       d: func() string {
          return "NowCoder"
       },
       e: make(chan struct{}),
    }
    _, err := json.Marshal(s)
    if err != nil {
       log.Printf("err occurred ..")
       return
    }
    log.Printf("everything is ok.")
    return
}

A. 发生错误,输出 err occurred

B. 没有发生错误,输出 everything is ok

C. 发生 panic

分析

在对结构体序列化为 JSON 时,需要注意几点问题:

  1. 字段能否导出,如果字段首字母是大写的,就可以导出,否则就是不可导出的;

  2. 不支持序列化的类型:通道(Channel)和函数(Func)类型是不能序列化,如果我们尝试对这些类型进行序列化,会直接报错。

但在本题中,尽管标准库在遇到管道/函数等无法被序列化的内容时会发生错误,但因为本题中 d 和 e 均为小写未导出变量,因此不会发生序列化错误。

所以本题选择 B。

2.自增操作

2.(多选)关于变量的自增和自减操作,下面语句正确的是

A.

1
2
i := 1
i++

B.

1
2
i := 1
j := i++

C.

1
2
i := 1
++i

D.

1
2
i := 1
i--
分析

在 Go 语言中,不支持前置自增的操作,所以 C 选项是错误的;

在 Go 语言中,++、– 操作符都是后置操作符,必须跟在操作数后面(不支持前置自增的操作),并且它们没有返回值,所以它们不能用于表达式。

所以 B、C 选项是错误的;选择 AD。

3.slice和map初始化

3.关于slice或map操作,下面正确的是

A.

1
2
var s []int
s = append(s, 1)

B.

1
2
var m map[string]int
m["one"] = 1

C.

1
2
3
var s []int
s = make([]int, 0)
s = append(s, 1)

D.

1
2
3
var m map[string]int
m = make(map[string]int)
m["one"] = 1
分析

在 Go 语言中,如果你声明了一个切片(slice)但没有为其分配任何内存(即没有初始化它),然后尝试使用append函数向其中添加元素,Go 会为你自动处理底层的数组分配和扩容。所以 A 选项正确。

如果声明了一个map但没有为其分配内存(即没有初始化它),然后尝试向其中添加元素,会得到一个运行时错误(panic)。这是因为Go中的map是一个引用类型,它需要一个底层的哈希表来存储键值对。当声明一个map但没有初始化它时,它实际上是一个nil的引用,没有指向任何有效的内存区域。

为了避免这个错误,需要在向map添加元素之前,使用make函数来初始化它。make函数会为map分配底层的哈希表,并返回一个指向该哈希表的引用。

所以 B 选择不正确。

C 选项先声明了切片 s,然后使用 make 对其初始化(分配内存),最后使用append 向 s 中添加元素,正确。

D 选项和 C 选项一样,也是正确的。

0%