这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
- 基础语法(中)
二、详细知识点介绍:
- 基础语法(中)
- map(集合)
map 是一种无序的键值对的集合。Map使用哈希表实现,因此对其的迭代是无序的。 使用map关键字定义map:
/* 声明变量, */
var map_variable map[key_data_type]value_data_type
使用内建函数make定义map:
map_variable := make(map[key_data_type]value_data_type)
声明后默认map的默认值是nil。
map的调用方式与数组和切片类似,在此不再赘述。
可以使用delete()函数删除map中的元素。
delete(map,key)
- range
range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
迭代的格式如下:
for key, value := range Map {
newMap[key] = value
}
其中key 和 value 可以省略。
如果只想读取 key:
for key := range Map
或
for key, _ := range Map
如果只想读取 value:
for _, value := range Map
- 函数
函数是基本的代码块,用于执行一个任务。
Go 语言最少有个 main() 函数。
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
函数定义解析:
func:函数由func开始声明function_name:函数名称,参数列表和返回值类型构成了函数签名。parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。return_types:返回类型,函数返回一列值。return_types是该列值的数据类型。有些功能不需要返回值,这种情况下return_types不是必须的。- 函数体:函数定义的代码集合。
个人认为,go的函数与C++的大体一致,只不过将返回值移到了最后面,使其可以显式地返回多个值,而这也是其与C++最大的区别。
- 指针
一个指针变量指向了一个值的内存地址。
指针声明格式如下:
var var_name *var-type
var-type为指针类型,var_name为指针变量名,*号用于指定变量是作为一个指针。
在指针类型前面加上*号(前缀)来获取指针所指向的内容。
当一个指针被定义后没有分配到任何变量时,它的值为nil。nil指针也称为空指针。
一个指针变量通常缩写为ptr。
类似于基础的C++指针。
12. 结构体
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体定义需要使用type和struct语句。struct语句定义一个新的数据类型,结构体中有一个或多个成员。type语句设定了结构体的名称。结构体的格式如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:
variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
没有被初始化的成员会被赋予其对应的空值。
如果要访问结构体成员,需要使用点号.操作符,格式为:
结构体.成员名
结构体可以像其他数据类型一样将结构体类型作为参数传递给函数。
可以定义指向结构体的指针类似于其他指针变量,格式如下:
var struct_pointer *Books
以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:
struct_pointer = &Book1
使用结构体指针访问结构体成员,使用 . 操作符:
struct_pointer.title
个人认为其与C++的不同仅为其结构体指针访问结构体成员需用.,而C++需用->。
13. 结构体方法
即在结构体中的函数,类似于其他语言的类函数。
示例如下:
func (u user) checkPassword(password string) bool{
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
若使用指针即可修改结构体。
调用时同样使用 . 操作符。
个人认为与C++完全相同。
三、引用参考: