全部学科
Python全栈
python
NodeJS全栈
nodejs

GO复合数据类型专题测试

20 题 40 分钟 难度:★★

考察知识点

1. 数组(Array)

  • 数组定义:固定长度、同类型元素集合
  • 定义语法:[N]type{元素}[...]type{元素}自动推断长度
  • 数组特点:长度是类型组成部分、值类型、拷贝传递
  • 数组操作:索引访问、遍历、初始化

2. 切片(Slice)

  • 切片定义:动态长度、引用类型、底层指向数组
  • 创建方式:make([]type, len, cap)、从数组/切片截取、直接初始化
  • len与cap:len是元素数量、cap是容量、扩容机制
  • 切片操作:append追加、copy拷贝、截取子切片
  • nil切片:未初始化切片为nil、len=0、cap=0

3. 结构体(Struct)

  • 结构体定义:使用struct关键字、字段集合
  • 字段定义:字段名+类型、可嵌套结构体
  • 结构体初始化:字段顺序初始化、字段名初始化、new函数
  • 方法绑定:值接收者、指针接收者、方法调用规则
  • 结构体嵌入:匿名字段、继承嵌入类型方法

4. 映射(Map)

  • map定义:键值对集合、引用类型
  • 创建方式:make(map[key]value)、直接初始化map[key]value{}
  • map操作:添加、删除、获取、检查键存在、遍历、长度
  • map特点:无序、键必须可比较、引用类型
  • nil map:未初始化map为nil、读取返回零值、写入panic

5. 复合类型组合使用

  • 切片元素为结构体:[]structName{}
  • 结构体字段为切片:struct { field []int }
  • 结构体字段为map:struct { field map[string]int }
  • map值为结构体:map[key]structName{}
  • map值为切片:map[key][]int{}
  • 嵌套初始化:多层复合字面量

6. 值类型与引用类型

  • 值类型:数组、结构体、拷贝传递、修改不影响原值
  • 引用类型:切片、map、传递引用、修改影响原值
  • 函数参数:值类型拷贝、引用类型共享底层数据
  • 深拷贝vs浅拷贝:copy函数实现切片深拷贝

7. make与new

  • make函数:创建切片、map、channel、返回初始化后的值
  • new函数:创建类型实例、返回指针、零值初始化
  • 适用场景:make用于引用类型、new用于值类型获取指针

8. 复合数据类型最佳实践

  • 切片预分配:已知容量时使用make预分配减少扩容
  • map容量预估:指定容量减少扩容开销
  • 结构体字段顺序:内存对齐优化
  • 值接收者vs指针接收者:大结构体用指针、小结构体用值
  • 避免nil map写入:初始化后再操作
💡 参考答案在文末
判断题
1

Go结构体创建时,未初始化的字段会自动设置为对应类型的零值。

A

B

2

Go数组是固定长度的,长度是数组类型的一部分,[3]int和[4]int是不同的类型。

A

B

3

Go map的键可以是任何类型,包括切片、map和函数。

A

B

4

Go切片的len(长度)表示当前元素数量,cap(容量)表示底层数组可容纳的最大元素数量。

A

B

5

Go中未初始化的map(nil map)可以直接添加元素。

A

B

6

Go结构体可以定义方法,方法可以绑定到结构体或结构体指针。

A

B

单选题
7

Go语言中定义切片的正确方式是?

A

var sl = [3]int{1,2,3}

B

var sl = []int{1,2,3}

C

var sl = makeint

D

var sl = slice{int}

8

Go语言中定义数组的语法是?

A

var arr = [3]int{1,2,3}

B

var arr = []int{1,2,3}

C

var arr = int[3]{1,2,3}

D

var arr = array{int, 3}

9

Go语言中定义map的正确语法是?

A

var m = map[int]string{}

B

var m = {int: string}

C

var m = make(map[int]string)

D

A和C都正确

10

Go语言中定义结构体使用哪个关键字?

A

class

B

struct

C

object

D

type struct

多选题
11

Go数组初始化的正确语法包括?

A

arr := [3]int{1, 2, 3}

B

arr := [...]int{1, 2, 3}

C

arr := [5]int{1: 10, 3: 30}

D

var arr [3]int

E

arr := make([3]int)

12

Go map的常见操作包括?

A

m[key] = value添加或修改元素

B

delete(m, key)删除元素

C

v, ok := m[key]检查元素是否存在

D

for range遍历map

E

len(m)获取元素数量

13

Go创建结构体实例的方式包括?

A

p := Person{Name: "张三", Age: 25}

B

p := Person{"张三", 25}

C

p := new(Person)

D

p := &Person{Name: "张三"}

E

var p Person

14

Go中数组与切片的区别包括?

A

数组长度固定,切片长度可变

B

数组是值类型,切片是引用类型

C

数组可以直接赋值,切片需要make初始化才能添加元素

D

数组传递会复制,切片传递共享底层数组

E

数组长度是类型的一部分

填空题
15

Go结构体使用 ____________ 访问字段,语法 ____________。可以使用 ____________ 访问结构体,Go会 自动 解引用。匿名字段可以实现 嵌入 效果,直接访问嵌入结构体的字段。

16

Go map使用 ____________ 访问元素,使用 ____________ 添加或修改元素,使用 ____________ 函数删除元素。检查元素是否存在使用 , ok := m[key],ok为 true 表示存在, false 表示不存在。

17

Go切片使用 ____________ 函数追加元素,使用 ____________ 获取长度,使用 ____________ 获取容量。切片表达式 sl[start:end 取从start到 end-1 的元素。超出容量时append会 自动扩容。

18

切片是基于 ____________ 的引用类型,包含三个信息: ____________ 指向底层数组、 ____________ 当前长度、 cap 容量。切片表达式 arr[start:end 可以从数组创建切片。append超过容量会 重新分配 底层数组。

19

Go数组定义时长度必须 ____________ 或使用 ____________ 自动推断。可以使用 ____________ 初始化元素,未指定的元素自动设为 零值。数组长度用 len 函数获取。

20

Go结构体可以包含 ____________________________________ 等复合类型字段。包含 map 字段时必须 初始化 才能使用,包含 切片 字段时可以直接 append 因为nil切片可以追加。

参考答案
1.正确 2.正确 3.错误 4.正确 5.错误 6.正确 7.B 8.A 9.D 10.B 11.A;B;C;D 12.A;B;C;D;E 13.A;B;C;D;E 14.A;B;D;E 15.点号;p.FieldName;指针 16.m[key];m[key] = value;delete 17.append;len;cap 18.数组;指针;len 19.指定;...;{} 20.切片;map;数组
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一套试卷 GO变量与常量专题测试
下一套试卷 → GO工程化与工具链专题测试
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码