Go基本数据结构的使用:string、slice、map

简介: Go中的字符串是一个字节的切片。可以通过将其内容封装在“”中来创建字符串。Go中的字符串是Unicode兼容的,并且是UTF-8编码的。

1.string(字符串)

      Go中的字符串是一个字节的切片。可以通过将其内容封装在“”中来创建字符串。Go中的字符串是Unicode兼容的,并且是UTF-8编码的。

1.1 基本使用

func StringTest() {
   str1 := "Hello"         //声明方式1
   str2 := string("World") //声明方式2
   fmt.Println(str1)
   fmt.Println(str2)
}

运行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DaEiVGZN-1624873287661)(Go基本数据结构的使用.assets/image-20210628130431153.png)]

1.2 strings包中操作string的函数

func StringTest() {
   str1 := "Hello"
   str2 := string("World")
   /**
   strings的常见函数
   */
   index := strings.Index(str1, "e")        //查找“e”在str1中的位置
   contains := strings.Compare(str1, str2)  //Compare返回一个按字典顺序比较两个字符串的整数。 如果a==b,则结果为0,如果a < b则为-1,如果a > b则为+1。
   fold := strings.EqualFold(str1, str2)    //类似于Java里的equals()
   contain := strings.Contains(str1, "llo") //查找“llo”是否在str1中
   fmt.Println(index)
   fmt.Println(contains)
   fmt.Println(fold)
   fmt.Println(contain)
}

运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RokY6M4-1624873287663)(Go基本数据结构的使用.assets/image-20210628131316976.png)]

1.3 strconv包中与string相关函数

访问strconv包,可以实现string和其他数值类型之间的转换。

func StrconvTest() {
   /**
   参数1 数字的字符串形式
   参数2 数字字符串的进制 比如二进制 八进制 十进制 十六进制
   参数3 返回结果的bit大小 也就是int8 int16 int32 int64
   */
   parseInt, err := strconv.ParseInt("456", 16, 32)
   if err == nil {
      fmt.Println(parseInt)
   }
   /**
   参数1 数字的字符串形式
   (相当于调用了ParseInt(s, 10, 0))
   */
   atoi, err := strconv.Atoi("123")
   if err == nil {
      fmt.Println(atoi)
   }
   /**
   参数1 放入true或false
   */
   parseBool, err := strconv.ParseBool("false")
   if err == nil {
      fmt.Println(parseBool)
   }
}

运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAf6DeGO-1624873287665)(Go基本数据结构的使用.assets/image-20210628132951504.png)]

2.slice(切片)

     Go 语言切片是对数组的抽象。
     Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
      切片是一种方便、灵活且强大的包装器。切片本身没有任何数据。它们只是对现有数组的引用。
      切片与数组相比,不需要设定长度,在[]中不用设定值,相对来说比较自由
从概念上面来说slice像一个结构体,这个结构体包含了三个元素:

  1. 指针,指向数组中slice指定的开始位置
  2. 长度,即slice的长度
  3. 最大长度,也就是slice开始位置到数组的最后位置的长度

2.1 定义

//声明方式一
var ints1 []int
//声明方式二
ints2 := make([]int, 0)

2.2 常见操作

func SliceTest() {
   //声明方式一
   var ints1 []int
   //声明方式二
   ints2 := make([]int, 0)
   //添加元素
   ints1 = append(ints1, 2, 2, 3, 4, 5, 8)
   ints2 = append(ints2, 9, 4, 2, 3, 5, 6)
   //根据下标查找元素
   i := ints1[2]
   fmt.Println(i)
   //遍历
   for i := 0; i < len(ints2); i++ {
      fmt.Print(ints2[i], "  ")
   }
   fmt.Println()
   //删除元素
   fmt.Println(ints1)
   ints1 = append(ints1[:1], ints1[2:]...)
   fmt.Println(ints1)
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nk2a3qeU-1624873287666)(Go基本数据结构的使用.assets/image-20210628173932789.png)]

2.3 常见函数

len() :获取长度

cap() :测量切片最长可以达到多少

append() :向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice

copy():copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数

3.map(字典)

map是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值

3.1 定义

/* 声明变量,默认 map 是 nil */
var map_variable(Map名称) map[key_data_type(键类型)]value_data_type(值类型)

/* 使用 make 函数创建 */
map_variable = make(map[key_data_type]value_data_type)

rating := map[string]float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 }
//如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对

3.2 常见操作

func MapTest() {
    var m1 map[string]string /*创建集合 */
    m1 = make(map[string]string)

    /* map插入key - value对,各个国家对应的首都 */
    m1["France"] = "巴黎"
    m1["Italy"] = "罗马"
    m1["Japan"] = "东京"
    m1["India "] = "新德里"

    /*使用键输出地图值 */
    for country := range m1 {
        fmt.Println(country, "首都是", m1[country])
    }
    /*查看元素在集合中是否存在 */
    capital, ok := m1["American"] /*如果确定是真实的,则存在,否则不存在 */
    fmt.Println(capital)
    fmt.Println(ok)
    if ok {
        fmt.Println("American 的首都是", capital)
    } else {
        fmt.Println("American 的首都不存在")
    }
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuGhQf4k-1624873287668)(Go基本数据结构的使用.assets/image-20210628174116046.png)]

3.3 常见函数

delete(map, key) 函数:用于删除集合的元素, 参数为 map 和其对应的 key。删除函数不返回任何值

先到这里就ok啦,因为博主也是go语言初学者,高深的东西以后再分享吧!

相关文章
go语言中遍历映射(map)
go语言中遍历映射(map)
331 8
|
7月前
|
存储 人工智能 安全
深入理解 go sync.Map - 基本原理
本文介绍了 Go 语言中 `map` 在并发使用时的常见问题及其解决方案,重点对比了 `sync.Mutex`、`sync.RWMutex` 和 `sync.Map` 的性能差异及适用场景。文章指出,普通 `map` 不支持并发读写,容易引发错误;而 `sync.Map` 通过原子操作和优化设计,在某些场景下能显著提升性能。同时详细讲解了 `sync.Map` 的基本用法及其适合的应用环境,如读多写少或不同 goroutine 操作不同键的场景。
312 1
|
9月前
|
存储 安全 Go
Map的遍历与判断键是否存在-《Go语言实战指南》
本文介绍了 Go 语言中对 `map` 的常见操作,包括遍历所有项和判断键是否存在。通过 `for range` 可以遍历 `map` 的键值对、仅键或仅值(需忽略键)。注意,`map` 遍历顺序是随机的。判断键是否存在时,使用双赋值语法 `value, ok := map[key]`,其中 `ok` 表示键是否存在。直接访问不存在的键会返回类型的零值,可能导致逻辑错误。掌握这些机制可更安全高效地处理键值对数据。
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
377 4
|
9月前
|
人工智能 Go
[go]Slice 切片原理
本文详细介绍了Go语言中的切片(slice)数据结构,包括其定义、创建方式、扩容机制及常见操作。切片是一种动态数组,依托底层数组实现,具有灵活的扩容和传递特性。文章解析了切片的内部结构(包含指向底层数组的指针、长度和容量),并探讨了通过`make`创建切片、基于数组生成切片以及切片扩容的规则。此外,还分析了`append`函数的工作原理及其可能引发的扩容问题,以及切片拷贝时需要注意的细节。最后,通过典型面试题深入讲解了切片在函数间传递时的行为特点,帮助读者更好地理解和使用Go语言中的切片。
285 0
|
12月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
406 9
go语言for遍历映射(map)
go语言for遍历映射(map)
463 12
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
377 2
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】