Go语言——复合类型 下

简介: Go语言——复合类型 下

5. map集合

map以散列表方式存储键值对集合

map中每个元素都是键值对

声明格式:

map [键的类型] 值的类型{key:value,key:value}

key是操作map的唯一标准可以通过key对map中元素进行增加/删除/修改/查看

key是唯一的,添加重 复的key会覆盖之前的元素.

map是 引用类型 (不是值类型,目前学到的引用类型就是切片和map),只声明时为空指针(nil)

map读写数据时并不是并发安全的,可以结合RWMutex保证并发安全(RWMutex在后面讲解)

fmt.Println(map01) // map[名称:单冰 年龄:123]
map01["名称"]= "傻逼"
fmt.Println(map01) // map[名称:傻逼 年龄:123]

a.【实例化map的方式】

使用make函数

ap01:= make(map[int]int)

可以在声明map时直接给map赋初始值.注意初始值在一行和在多行写时的语法区别

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

map中元素键值对语法满足: key:value

key和value的类型必须和map[key]value类型严格对应

map01 := make(map[int]string)
map02 := map[string]string{"年龄":"123","名称":"单冰"}

b.【操作map中的元素】

使用key判断,如果key不存在向map中新增数据,如果key存在会覆盖map中元素

Go语言标准库中提供了对map元素删除的函数,使用顶层delete()即可完成删除

如果key存在,执行删除元素

如果key不存在,map中内容不变,也不会有错误

map01 := map[int]int{1:1,2:2}
delete(map01, 1)

查看map中key对应的value 如果有 返回对应value 如果没有 返回对应类型的默认值

value,ok := s[3] 返回俩值 一个是key对应value 一个是该key是否存在

func main() {
    map01 := make(map[int]int)
    a,b:=map01[3]
    fmt.Println(a,b) // 0 false
}

c.【map作为参数传递】

同切片一样 都是引用传递,函数中对map的操作就是对原map的操作。

func main() {
  map01 := map[int]int{1:1,2:2}
  modify(map01)
  fmt.Println(map01)
}
func modify(m map[int]int)  {
  m[3] = 3
  m[4] = 4
}

6. 结构体

有时我们需要将不同类型的数据组合成一个有机的整体。

如:一个学生有学号/姓名/性别/年龄/地址等属性。

显然单独定义以上变量比较繁琐,数据不便于管理。

// 正常写法
var id int
var name string
var sex string
var age int 
var addr string
// 使用结构体表示法
type Student struct {
    id int
    name string
    sex string
    age int
    addr string
}

结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。

每个数据称为结构体的成员。

注意:结构体的定义是在主函数的外面的。

a.【结构体定义与初始化】

定义:

type 结构体名 struct {

(结构体成员列表)

成员名 数据类型

}

定义结构体变量:

var 变量名 结构体名

type Student struct {
    id int
    name string
    sex string
    age int
    addr string
    function func(int2 int) string
  slice []int
    arr [4]int
    map01 map[int]int
}

注意:

结构体名 大小写问题,见可见性部分。

初始化:

//1. 顺序初始化(每个成员必须初始化 且顺序要一致)
var stu1 Student = Student{1,"xxx","男",1,"地球"}
//2. 自动推导 和指定成员赋值 未赋值的成员为默认值
stu1 := Student{1,"xxx","男",1,"地球"}
stu1 := Student{name: "xxx",id: 1}
fmt.Println(stu1.name) // xxx

b.【结构体变量的定义与赋值】

var stu1 Student
stu1.id = 1
stu1.name = "xxx"

注意:

结构体名默认指向的就是第一个成员的地址

var stu1 Student
stu1.id = 1
stu1.name = "xxx"
fmt.Printf("%p\n",&stu1) // 0xc00001e080
fmt.Printf("%p\n",&stu1.id) // 0xc00001e080
fmt.Printf("%p\n",&stu1.name) // 0xc0000dc008
  1. 类似于java中的 类 student类 可以有成员变量 也可以有成员方法 。

c.【结构体数组 与 切片 与 map】

type Student struct {
  id int
  age int
}
func main() {
  var stu01 Student
  var stu02 Student
  stu01.id=1
  stu02.id=2
  // 存放类型为结构体类型的数组、和 切片
  var stuArr = [2]Student{
    stu01,
    stu02,
  }
  fmt.Println(stuArr)
  var stuSli = []Student{
    stu01,
    stu02,
  }
  fmt.Println(stuSli)
  var stuMap  = map[int]Student{
    1:stu01,
    2:stu02,
  } 
  fmt.Println(stuMap)
}

d.【结构体作为参数传递】

结构体作为函数参数传递的时候为值传递

type Student struct {
  id int
  age int
}
func main() {
  var stu01 Student = Student{1,19}
  test001(stu01)
  fmt.Println(stu01) // {1 19}
}
func test001(student Student)  {
  student.age=333
}

e.【可见性】

Go语言对关键字的增加非常吝啬,其中没有private、 protected、 public这样的关键字。

要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母开头。

相关文章
|
7天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
20 7
|
7天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
7天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
84 71
|
6天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
89 67
|
7天前
|
存储 Go
go语言中映射
go语言中映射
24 11
|
9天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
23 12
|
8天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
17 9
|
8天前
|
Go 索引
go语言使用range关键字
go语言使用range关键字
16 7
|
9天前
|
Go
go语言for 遍历字符串
go语言for 遍历字符串
21 8
|
8天前
|
Go 索引
go语言修改元素
go语言修改元素
18 6