Go - 【字符串,数组,哈希表】常用操作

2023-09-18 14:33:22

一. 字符串

  1. 字符串长度:
s := "hello"
l := len(s)
fmt.Println(l) // 输出 5
  1. 遍历字符串:
s := "hello"
for i, c := range s {
    fmt.Printf("%d:%c ", i, c)
}
// 输出:0:h 1:e 2:l 3:l 4:o

for i := 0; i < len(s); i ++ {
	fmt.Printf("%s ", s[i])
}
  1. 字符串比较:
s1 := "hello"
s2 := "world"
if s1 == s2 {
    fmt.Println("equal")
} else {
    fmt.Println("not equal")
}
// 输出 not equal
在这里插入代码片
  1. 拼接字符串:
s1 := "hello"
s2 := "world"
s3 := s1 + " " + s2
fmt.Println(s3) // 输出 hello world
  1. 字符串切割:
s := "a,b,c,d"
parts := strings.Split(s, ",")
for _, p := range parts {
    fmt.Println(p)
}
// 输出:
// a
// b
// c
// d
  1. 字符串替换:
s := "hello world"
s = strings.Replace(s, "world", "go", -1)
fmt.Println(s) // 输出 hello go
  1. 字符串查找:
s := "hello world"
idx := strings.Index(s, "world")
fmt.Println(idx) // 输出 6
  1. 字符串截取:
s := "hello world"
substr := s[0:5]
fmt.Println(substr) // 输出 hello
  1. 字符串转换:
s := "123"
n, err := strconv.Atoi(s)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Printf("n=%d, type=%T\n", n, n)
    // 输出 n=123, type=int
}

s = strconv.Itoa(n)
fmt.Printf("s=%s, type=%T\n", s, s)
// 输出 s=123, type=string
  1. 字符串格式化:
name := "Tom"
age := 18
s := fmt.Sprintf("name=%s, age=%d", name, age)
fmt.Println(s) // 输出 name=Tom, age=18
  1. 判断字符时候在字符串当中
import "strings"

func contains(s string, c byte) bool {
    return strings.ContainsRune(s, rune(c))
}

func index(s string, c byte) int {
    return strings.IndexByte(s, c)
}

// contains函数使用了strings包的ContainsRune函数,该函数可以判断一个字符是否在字符串中。
// index函数使用了strings包的IndexByte函数,该函数可以返回字符在字符串中的位置。
  1. 排序
package main

import (
    "fmt"
    "sort"
)

func main() {
    strSlice := []string{"abc", "aaa", "bce", "bcd"}
    
    // 正序排序
    sort.Strings(strSlice)
    fmt.Println("正序:", strSlice)
    
    // 反序排序
    sort.Sort(sort.Reverse(sort.StringSlice(strSlice)))
    fmt.Println("反序:", strSlice)
}

二. 数组 - 列表

  1. 创建列表:
myList := []int{1, 2, 3, 4, 5}
  1. 获取列表长度:
length := len(myList)  // 等于 5
  1. 访问列表元素:
firstElement := myList[0]     // 等于 1
lastElement := myList[len(myList)-1]  // 等于 5
sublist := myList[1:3]         // 等于 [2,3]
  1. 修改列表元素:
myList[0] = 10     // 现在 myList 等于 [10, 2, 3, 4, 5]
  1. 添加元素:
myList = append(myList, 6)       // 现在 myList 等于 [10, 2, 3, 4, 5, 6]
myList = append(myList, 7, 8)    // 现在 myList 等于 [10, 2, 3, 4, 5, 6, 7, 8]
  1. 删除元素:
myList = append(myList[:0], myList[1:]...)  // 现在 myList 等于 [2, 3, 4, 5, 6, 7, 8]
myList = append(myList[:2], myList[3:]...) // 从列表中删除第 3 个元素,现在 myList 等于 [2, 3, 5, 6, 7, 8]
  1. 检查元素是否在列表中:
for _, element := range myList {
    if element == 3 {
        fmt.Println("3 在列表中")
    }
}
  1. 列表排序:
sort.Ints(myList)          // 现在 myList 等于 [2, 3, 5, 6, 7, 8]
sort.Sort(sort.Reverse(sort.IntSlice(myList)))   // 现在 myList 等于 [8, 7, 6, 5, 3, 2]
  1. 合并列表:
newList := append(myList, []int{9, 10}...)  // 等于 [2, 3, 5, 6, 7, 8, 9, 10]
  1. 列表复制:
copyOfList := make([]int, len(myList))
copy(copyOfList, myList)  // 等于 [2, 3, 5, 6, 7, 8]

三. 哈希表 - 字典

  1. 创建哈希表:
myMap := make(map[string]int)
  1. 在哈希表中设置键值:
myMap["apple"] = 1
myMap["banana"] = 2
myMap["orange"] = 3
  1. 从哈希表中获取键值:
value := myMap["apple"]    // 等于 1

Gomap数据类型没有类似Python中的get()方法,但可以通过访问哈希表中的值及其存在状态的方式来实现相似的功能。
我们可以使用以下代码来获取键为 “apple” 的值:

value, exists := myMap["apple"]

为了实现类似Python中的get()方法的功能,我们可以将代码向下修改:

func getValue(myMap map[string]int, key string, defaultValue int) int {
    if value, exists := myMap[key]; exists {
        return value
    }
    return defaultValue
}

value := getValue(myMap, "apple", 0)
  1. 检查键是否在哈希表中:
if _, ok := myMap["apple"]; ok {
    fmt.Println("apple 在哈希表中")
}
  1. 删除键值:
delete(myMap, "apple")      // 从哈希表中删除键值 "apple"
  1. 获取哈希表长度:
length := len(myMap)
  1. 迭代哈希表中的键值对:
for key, value := range myMap {
    fmt.Printf("key: %s, value: %d\n", key, value)
}
  1. 判断哈希表是否为空:
if len(myMap) == 0 {
    fmt.Println("哈希表为空")
}
  1. 创建和初始化哈希表:
myMap := map[string]int{
    "apple": 1,
    "banana": 2,
    "orange": 3,
}
  1. 复制哈希表:
copyOfMap := make(map[string]int)
for key, value := range myMap {
    copyOfMap[key] = value
}
  1. 判断键是否存在哈希表中
func main() {
    dict := map[string]int{
        "foo": 1,
        "bar": 2,
        "baz": 3,
    }

    // 判断 "foo" 是否在字典中
    if _, ok := dict["foo"]; ok {
        fmt.Println("found foo")
    } else {
        fmt.Println("not found foo")
    }

    // 判断 "qux" 是否在字典中
    if _, ok := dict["qux"]; ok {
        fmt.Println("found qux")
    } else {
        fmt.Println("not found qux")
    }
}

// 如果dict字典中存在"foo"键,则输出"found foo",否则输出"not found foo"。
// 同理,如果dict字典中不存在"qux"键,则输出"not found qux"。
  1. 字典排序

使用 sort.Slice 函数对 map 的键或值进行排序

package main

import (
    "fmt"
    "sort"
)

func main() {
    dict := map[string]int{
        "foo": 1,
        "bar": 2,
        "baz": 3,
    }

    keys := make([]string, 0, len(dict))
    for k := range dict {
        keys = append(keys, k)
    }

    sort.Slice(keys, func(i, j int) bool {
        return keys[i] < keys[j]
    })

    for _, k := range keys {
        fmt.Printf("%v: %v\n", k, dict[k])
    }
}

先创建一个字符串类型的列表 keys,用于存储 map 中的键。然后,使用 range 遍历 dict,将其中的键添加到 keys 列表中。接着,使用 sort.Slice 函数对 keys 列表进行排序,排序函数使用匿名函数的方式进行定义,在该函数中,使用 < 符号来比较两个键的大小。最后,使用遍历的方式输出排序后的键和相应的值。

以上就是关于Go - 【字符串,数组,哈希表】常用操作的基本使用,希望对你有所帮助!

更多推荐

leetcode做题笔记147. 对链表进行插入排序

给定单个链表的头head,使用插入排序对链表进行排序,并返回排序后链表的头。插入排序算法的步骤:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。下面是插入排序算法的

免费可源可商用的BI工具对比(支持Doris 数据库)

目前市面上有很多开源的BI工具可供选择,以下是几个免费、开源且可以商用的BI工具,并且支持和Doris数据库结合使用:Superset:由Airbnb发起的开源BI工具,带有可视化和交互式仪表盘功能。Superset支持多种数据源,其中包括Doris数据库。Metabase:一个简单易用的BI工具,支持数据可视化和SQ

全链路自动化测试

背景从SOA架构到现在大行其道的微服务架构,系统越拆越小,整体架构的复杂度也是直线上升,我们一直老生常谈的微服务架构下的技术难点及解决方案也日渐成熟(包括典型的数据一致性,系统调用带来的一致性问题,还是跨节点跨机房复制带来的一致性问题都有了很多解决方案),但是有一个环节我们明显忽略了。在现在的微服务架构趋势下,微服务在

陆拾捌- 如何通过数据影响决策(三)

一、如何正确的引导别人?引导与误导的区别是什么?看下面这广告图单看上面大字的结果,感觉好像真的使用过的人均觉得有好处可如果我们看下面的细字对111位连续14天食用(本产品)的燕麦片非重度使用者所做调研…从理性上来说,如果一个人觉得没用处,还会连续食用14天吗?所以这里用的一个技巧就是,从数据中各个维度深挖,然后把最有利

【C# 基础精讲】构造函数和析构函数

构造函数(Constructor)和析构函数(Destructor)是面向对象编程中的两个重要概念,它们分别用于在对象创建和销毁的时候执行特定的操作。这两个函数在C#以及其他面向对象编程语言中都具有重要的作用,用于初始化对象的状态、分配资源,以及在对象被销毁时释放资源。在本文中,我们将详细探讨构造函数和析构函数的概念、

Java乐观锁的实现

乐观锁是一种用于解决并发冲突的机制,它基于假设在大多数情况下没有并发冲突的原则。与悲观锁不同,乐观锁不会对数据加锁,而是通过一定的方式来检测并处理并发冲突。在实现乐观锁时,通常会使用版本号或时间戳作为标识。当多个线程同时访问同一个数据时,每个线程都会读取到数据的当前版本号或时间戳。在更新数据时,线程会比较当前的版本号或

【AI视野·今日CV 计算机视觉论文速览 第250期】Wed, 20 Sep 2023

AI视野·今日CS.CV计算机视觉论文速览Wed,20Sep2023Totally95papers👉上期速览✈更多精彩请移步主页DailyComputerVisionPapersPanopticNeRF-360:Panoramic3D-to-2DLabelTransferinUrbanScenesAuthorsXia

WebGL 用鼠标控制物体旋转

目录鼠标控制物体旋转如何实现物体旋转示例程序(RotateObject.js)代码详解示例效果鼠标控制物体旋转有时候,WebGL程序需要让用户通过鼠标操作三维物体。这一节来分析示例程序RotateObject,该程序允许用户通过拖动(即按住左键移动)鼠标旋转三维物体。为了简单,示例程序中的三维物体是一个立方体,但拖曳鼠

新型智慧公厕“1+3+N”架构,平台、系统、应用的创新

近年来,随着人民生活水平的提高,人们对公共设施的要求也越来越高。其中,如厕问题一直是人们关注的焦点,但传统的公厕设施已经不能满足人们对干净、舒适、安全的需求,这促使了新型智慧公厕的诞生与应用,以如中期科技「智慧公厕-智慧厕所」以“1+3+N”规划策略,让公共厕所实现信息化、智慧化、网络化。本文以智慧公厕源头厂家广州中期

二叉搜索树经典笔试题【力扣、牛客】

文章目录1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先1.法一:定位p、q在左还是右分类讨论2.法二:利用stack求出p、q路径求相交值5.二叉搜索树与双向链表1.法一:递归:递归过程修正指针指向2.数组:将二叉搜索树进行中序遍历可以得到由小到大的顺序排列6.前序中序遍历序

Spark_Spark内存模型管理

工作中经常用到Spark内存调参,之前还没对这块记录,这次记录一下。环境参数spark内存模型中会涉及到多个配置,这些配置由一些环境参数及其配置值有关,为防止后面理解混乱,现在这里列举出来,如果忘记了,可以返回来看看:spark.executor.memory:JVMOn-Heap内存(堆内内存),在使用sparksu

热文推荐