Golang 百题(实战快速掌握语法)_1

整形转字符串类型

实验介绍

本实验将展示三种方法来实现整形类型转字符串类型。

知识点
  • strconv
  • fmt

Itoa 函数

代码实例

Go 语言中 strconv 包的 itoa 函数输入一个 int 类型,返回转换后的字符串。下面是一个例子。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 输入一个整数,返回一个字符串
    a := strconv.Itoa(1234)
    fmt.Printf("%T %v\n",a, a)
    // Output:
    // "string 1234"
}

将代码保存为/home/project/itoa.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run itoa.go

图片描述

FormatInt

代码实例

formatInt 函数将输入的 int64 类型整形转换为指定进制的字符串。格式如下所示:

FormatInt(i int64, base int)
// 以下函数将i转为二进制后返回它的字符串类型
FormatInt(i int64, 2)

我们来看一个例子:

package main

import (
    "strconv"
    "fmt"
)
func main() {
    // 输入int64类型的1234,设置为10进制
    b := strconv.FormatInt(int64(1234), 10)
    fmt.Printf("%T %v\n", b, b)
}

将代码保存为/home/project/formatInt.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run formatInt.go

图片描述

Sprintf 函数

代码实例

Go 语言中 fmt 包下的 Sprintf 函数根据格式说明符进行格式化,并返回结果字符串。

package main

import (
    "fmt"
)

func main() {
    // sprintf函数返回转换后的字符类型
    c := fmt.Sprintf("%d", 1234)
    fmt.Printf("%T %v\n", c, c)
}

将代码保存为/home/project/sprintf.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run sprintf.go

图片描述

实验总结

本实验我们学习了 itoa,formatInt 和 sprintf 函数的用法,它们都是 Go 语言中非常重要的知识,需要大家好好掌握。

整形转切片

实验介绍

本实验将展示如何通过strconv.Itoastrings.Split来实现整数转切片。

知识点
  • strconv
  • strings

整形转数组

代码实例

Go 语言中 strconv 包的 itoa 函数输入一个 int 类型,返回转换后的字符串。而 strings 包下的 Split 函数输入一个字符串和分隔符,返回分割后的切片,下面是一个例子。

package main

import (
    "fmt"
    "strconv"
    "strings"
)

//  转换int整形为数组
func Digits(n int) []int {
    s := strconv.Itoa(n)
    d := make([]int, len(s))
    for i, l := range strings.Split(s, "") {
        d[i], _ = strconv.Atoi(l)
    }
    return d
}
func main() {
    r := Digits(123) // [1 2 3]
    fmt.Println(r)
}

该程序的功能:

  • 使用strconv.Itoa来转换给定的数字为字符串。
  • 使用strings.Split()来分割转换后的字符串,并返回一个字符串切片。

将代码保存为/home/project/digits.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run digits.go

图片描述

实验总结

本实验学习了如何整形转为切片,下个实验我们将讲解如何连接集合的所有元素。

连接集合的所有元素

实验介绍

Go 原生支持字符串切片转字符串,但并不直接支持整形切片转字符 String,本实验我们将学习如何通过反射和fmt.Sprintf来实现整形切片转字符串。

知识点
  • slice
  • reflect
  • fmt.Sprintf

连接集合中的所有元素

代码实例

我们可以遍历整形切片的每个元素,然后把每个整形转为字符后添加分隔符后加入到字符串中,下面是一个例子。

package main

import (
    "fmt"
    "reflect"
    "strings"
)

func Join(params ...interface{}) string {
    arr, sp := reflect.ValueOf(params[0]),
        reflect.ValueOf(params[1]).String()
    ars := make([]string, arr.Len())

    for i := 0; i < arr.Len(); i++ {
        ars[i] = fmt.Sprintf("%v", arr.Index(i))
    }

    return strings.Join(ars, sp)

}
func main() {
    w := Join([]int{1, 2, 3}, ".")
    fmt.Printf("%T %v", w, w)
}

该程序的功能:

  • 使用relect.ValueOf()来获取数组或切片,还有字符串。

  • make 用来创建一个合适长度的字符串切片。

  • 使用 for 循环遍历每个元素,fmt.Sprintf()用来整形转字符类型。

  • strings.Join()的功能是使用提供的分隔符来组合字符串

将代码保存为/home/project/join.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run join.go

图片描述

实验总结

本实验我们学习了如何连接集合中的所有元素,下个实验我们将学习如何获得两个集合中的所有组合。

两个集合的所有组合

实验介绍

本实验将展示如何创建两个集合的所有集合,集合均为没有重复值。

知识点
  • for

两个集合的所有组合

代码实例

为了获得两个集合的所有集合,我们可以先创建一个二维切片列表,然后 for 循环输出并且保存到二维切片列表中。

package main

import (
    "fmt"
    "reflect"
)

func XProduct(params ...interface{}) [][]interface{} {
    a, b := reflect.ValueOf(params[0]), reflect.ValueOf(params[1])
    l := a.Len() * b.Len()
    r := make([][]interface{}, l)

    for i := 0; i < l; i++ {
        r[i] = []interface{}{
            a.Index(i % a.Len()).Interface(),
            b.Index((i / a.Len()) % b.Len()).Interface(),
        }
    }
    return r

}
func main() {
    r := XProduct([]int{1, 2}, []string{"a", "b"}) // [[1 a] [2 a] [1 b] [2 b]]
    fmt.Println(r)
}

该程序的功能:

  • 使用reflect.ValueOf()来获取切片或者数组。
  • 使用 for 循环来填充生成的结果

将代码保存为/home/project/xProduct.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run xProduct.go

图片描述

实验总结

本实验我们学习了如何通过反射和 for 循环获得两个集合的所有组合。下个实验我们将学习如何删除切片的重复元素。

删除切片重复元素

实验介绍

本实验将展示如何删除切片的重复元素。

知识点
  • range
  • append
  • make

删除切片重复元素

代码实例

删除重复切片的一个方法是创建一个字典来存储字符是否已经出现过。下面是一个例子。

package main

import (
    "fmt"
)

func DedupeInts(arr []int) []int {
    m, uniq := make(map[int]bool), make([]int, 0)
    for _, v := range arr {
        if _, ok := m[v]; !ok {
            m[v], uniq = true, append(uniq, v)
        }
    }
    return uniq
}
func main() {
    date := []int{1, 2, 1, 2, 3, 3, 4}
    res := DedupeInts(date)
    fmt.Printf("date: %v\nres: %v",date, res)
}

该程序的功能:

  • 使用 make 创建一个 map 来存储数据。
  • for 循环遍历传入切片的每一个元素,并进行判断是否在 map 中重复,如果不重复则加入到 map 中。

将代码保存为/home/project/dedupeInts.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run dedupeInts.go

图片描述

实验总结

本实验我们使用 map 类型来删除切片的重复元素。下个实验我们将学习如何得到集合频率的映射。

集合频率的映射

实验介绍

本实验将展示统计集合中数值出现的频率并返回。

知识点
  • for
代码实例

为了获得集合中数值的频率,我们可以创建一个 map 函数来存储,下面是具体的实现。

package main

import "fmt"

func FrequenciesInt(arr []int) map[int]int {
    m := make(map[int]int)
    for _, v := range arr {
        if f, ok := m[v]; ok {
            m[v] = f + 1
        } else {
            m[v] = 1
        }
    }
    return m
}
func FrequenciesFloat64(arr []float64) map[float64]int {
    m := make(map[float64]int)
    for _, v := range arr {
        if f, ok := m[v]; ok {
            m[v] = f + 1
        } else {
            m[v] = 1
        }
    }
    return m
}
func FrequenciesBool(arr []bool) map[bool]int {
    m := make(map[bool]int)
    for _, v := range arr {
        if f, ok := m[v]; ok {
            m[v] = f + 1
        } else {
            m[v] = 1
        }
    }
    return m
}
func FrequenciesString(arr []string) map[string]int {
    m := make(map[string]int)
    for _, v := range arr {
        if f, ok := m[v]; ok {
            m[v] = f + 1
        } else {
            m[v] = 1
        }
    }
    return m
}
func main() {
    i := []int{1, 1, 3, 1, 4}
    s := []string{"a", "d", "a", "d", "c"}
    r1 := FrequenciesInt(i)
    r2 := FrequenciesString(s)
    fmt.Println(i, "\t", r1, "\n", s, "\t", r2)
}

该程序的功能:

  • 使用make来创建一个字典。
  • 使用 for 循环来遍历给定的切片,对每个元素进行判断,如果是没有出现过则赋值为 1,否则进行累加。

将代码保存为/home/project/frequencies.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run frequencies.go

图片描述

实验总结

本实验我们学习了获得集合频率的映射,下个实验我们将要学习返回带有索引的切片。

返回带有索引的切片

实验介绍

本实验将通过创建 map 实现返回带有索引的切片。

知识点
  • map
  • reflect
代码实例

我们可以使用 for 循环来遍历输入的参数,然后把索引和相关的值保存到 map 中。下面是一个例子。

package main

import (
    "fmt"
    "reflect"
)

func WithIndex(params ...interface{}) map[int]interface{} {
    arr, m := reflect.ValueOf(params[0]),
        make(map[int]interface{})
    for i := 0; i < arr.Len(); i++ {
        m[i] = arr.Index(i).Interface()
    }
    return m
}
func main() {
    r := WithIndex([]int{4, 3, 2, 1}) // [0:4 1:3 2:2 3:1]
    fmt.Println(r)
}

该程序的功能:

  • 使用reflect.ValueOf()来获取切片或者数组。
  • 使用 for 循环来遍历数组,把每个元素添加到字典中。

将代码保存为/home/project/withIndex.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run withIndex.go

图片描述

实验总结

本实验我们学习了如何返回带有索引的切片,下个实验我们将学习如何使用函数参数的用法。

复制指定条件的切片

实验介绍

本实验将展示对输入的切片进行判断,并且返回符合指定条件的切片。

知识点
  • range
  • 函数参数
  • append
代码实例

Go 中可以把函数作为参数传入,所有我们可以对传入的参数进行遍历,每个元素通过传入的函数来进行判断,下面是一个例子。

package main

import "fmt"

func FilterInt(arr []int, f func(int) bool) []int {
    arf := make([]int, 0)
    for _, v := range arr {
        if f(v) {
            arf = append(arf, v)
        }
    }
    return arf
}
func FilterFloat64(arr []float64, f func(float64) bool) []float64 {
    arf := make([]float64, 0)
    for _, v := range arr {
        if f(v) {
            arf = append(arf, v)
        }
    }
    return arf
}
func FilterBool(arr []bool, f func(bool) bool) []bool {
    arf := make([]bool, 0)
    for _, v := range arr {
        if f(v) {
            arf = append(arf, v)
        }
    }
    return arf
}
func FilterString(arr []string, f func(string) bool) []string {
    arf := make([]string, 0)
    for _, v := range arr {
        if f(v) {
            arf = append(arf, v)
        }
    }
    return arf
}
func main() {
    intCheck := func(x int) bool { return x > 1 }
    fmt.Println(FilterInt([]int{0, 2}, intCheck)) // [2]
    float64Check := func(x float64) bool { return x > 0.5 }
    fmt.Println(FilterFloat64([]float64{0.0, 1.0}, float64Check)) // [1.0]
    boolCheck := func(x bool) bool { return x }
    fmt.Println(FilterBool([]bool{false, true}, boolCheck)) // [true]
    stringCheck := func(x string) bool { return len(x) > 1 }
    fmt.Println(FilterString([]string{"", "hi"}, stringCheck)) // ["hi"]
}

该程序的功能:

  • 创建一个条件函数,来作为参数传入主功能函数中
  • for 循环遍历每个元素,使用传入的函数进行判断

将代码保存为/home/project/filterInt.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run filterInt.go

图片描述

实验总结

本实验我们学习了如何通过函数传递条件函数,会返回符合指定条件的切片,下个实验我们同样使用函数参数,来实现返回集合中满足指定条件的第一个元素。

返回集合中符合条件的第一个元素

实验介绍

本实验将展示如何返回给定集合中符合条件的第一个元素。

知识点
  • for
代码实例

我们可以使用 for 循环来遍历输入的集合,然后通过传入的判断函数来进行判断,下面是一个具体例子。

package main

import "fmt"

func FindIndexInt(arr []int, f func(int) bool) int {
    for i, v := range arr {
        if f(v) {
            return i
        }
    }
    return -1
}
func main() {
    r1 := FindIndexInt([]int{1, 1, 2}, func(x int) bool { return x%2 == 0 }) // 2
    fmt.Println(r1)
}

该程序的功能:

  • 使用 range 来正向遍历切片,用 f 函数来判断是否符合条件。

将代码保存为/home/project/findIndexInt.go文件。

运行程序

打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:

go run findIndexInt.go

图片描述

实验总结

本实验我们学习了 如何通过参数来获得条件函数,然后返回集合中符合条件的第一个元素,下一个我们将做一个简单的挑战。

课后习题:

打印当前版本

挑战介绍

打印当前环境中 Go 的版本信息

挑战内容

本次挑战中,你需要打印当前 WebIDE 中 Go 的版本信息。

输出参考格式为:

Go version: 1.xx

挑战要求

  • 请自行在环境主目录/home/project下新建 print_version.go 文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。

图片描述

示例代码

package main

import (
    "fmt"
    "runtime"
)
func main(){

}

小贴士

  • 可以使用 runtime 包中的函数打印当前 Go 的版本。
  • 为了保证能被系统准确检测,挑战中的每一句话都非常重要,请仔细阅读。跳跃式浏览易导致挑战无法按要求通过。
参考代码

以下内容仅供参考,为了能有更好的学习效果,请尽量按自己的想法来完成挑战。

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Printf("Go version: %s\n", runtime.Version())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/702453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟TED演讲学英文:Toward a new understanding of mental illness by Thomas Insel

Toward a new understanding of mental illness Link: https://www.ted.com/talks/thomas_insel_toward_a_new_understanding_of_mental_illness Speaker: Thomas Insel Date: January 2013 文章目录 Toward a new understanding of mental illnessIntroductionVocabularySum…

【C语言】联合(共用体)

目录 一、什么是联合体 二、联合类型的声明 三、联合变量的创建 四、联合的特点 五、联合体大小的计算 六、联合的应用&#xff08;判断大小端&#xff09; 七、联合体的优缺点 7.1 优点 7.2 缺点 一、什么是联合体 联合也是一种特殊的自定义类型。由多个不同类型的数…

测长仪的发展历程!

测长仪的发展历程可以大致分为以下几个阶段&#xff1a; 早期发展&#xff1a; 最早的测量工具主要是一些机械式测量工具&#xff0c;如角尺、卡钳等。 16世纪&#xff0c;在火炮制造中已开始使用光滑量规。 1772年和1805年&#xff0c;英国的J.瓦特和H.莫兹利等先后制造出利用…

Win快速删除node_modules

在Windows系统上删除 node_modules 文件夹通常是一个缓慢且耗时的过程。这主要是由于几个关键因素导致的&#xff1a; 主要原因 文件数量多且嵌套深&#xff1a; node_modules 文件夹通常包含成千上万的子文件夹和文件。由于其结构复杂&#xff0c;文件和文件夹往往嵌套得非常…

XXL-JOB分布式任务调度快速入门

文章目录 概念快速启动XXL-JOB调度初始化执行器项目配置执行器新增GLUE模式(Java)的任务新增BEAN模式&#xff08;类形式&#xff09;的任务BEAN模式&#xff08;方法形式&#xff09;的任务参考来源 概念 XXL-JOB是一个开源的分布式任务调度平台&#xff0c;它是一个轻量级、…

使用B树实现员工(人事)管理系统

1. 前言 使用B树来表示人事管理系统&#xff0c;其中每个节点代表一个人员&#xff0c;树的根节点为董事长&#xff0c;每个节点可以有多个子节点&#xff0c;表示下属。每一层代表一个等级分布。 addPerson: 添加人员功能通过查找指定上司节点&#xff0c;然后将新的人员作…

程序员/码农创业有多少种可能?

程序员创业&#xff0c;无疑是当下科技浪潮中的一股强大力量。凭借扎实的技术功底和敏锐的市场洞察力&#xff0c;在创业道路上展现出了无限的活力和创造力。那么&#xff0c;程序员创业究竟有哪些事情可以做呢&#xff1f;可以从技术产品的研发入手。 可以利用自己的专业知识…

分析GIS在疾病传播模型和公共卫生决策中的作用

在这个全球化日益加深的时代&#xff0c;疾病的跨国界传播成为全球公共卫生面临的重大挑战。地理信息科学&#xff08;GIS&#xff09;作为一门集成了空间数据采集、处理、分析及可视化的技术体系&#xff0c;在公共健康领域展现出其不可替代的价值。本文旨在深入探讨GIS如何助…

电动两轮车——电源方案

随着城镇化的发展人们的活动半径不断变宽&#xff0c;短交通出行方式仍能覆盖主要的范围。从主要国家核心地区的出行数据看平均通勤半径不高于15km&#xff0c;摩托车、电动两轮车等两轮出行方式能更好匹配日常短交通出行需求。 应用框图 通常&#xff0c;电动两轮车由三部分…

3D gaussian-splatting项目环境配置记录

1.前景 项目论文&#xff1a;https://arxiv.org/abs/2308.04079 GitHub项目下载地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting git clone时里面的子模块小项目会git不到&#xff0c;需要单独github下来&#xff0c;放入相应文件夹。 sibr_viewer…

C# WinForm —— 33 ContextMenuStrip介绍

1. 简介 右键某个控件/窗体时&#xff0c;弹出来的菜单&#xff0c;比如VS中右键窗体&#xff0c;弹出来的这个菜单&#xff1a; 和MenuStrip类似&#xff0c;ContextMenuStrip主菜单下面可以有子菜单&#xff0c;子菜单下面可以有下一级子菜单 2. 属性 和MenuStrip一样 …

第6章 应用层

考纲内容 &#xff08;一&#xff09;网络应用模型 客户/服务器模型&#xff1b;P2P模型 &#xff08;二&#xff09;域名系统(DNS) 层次域名空间&#xff1b;域名服务器&#xff1b;域名解析过程 &#xff08;三&#xff09;文件传输协议(FTP) …

升级和维护老旧LabVIEW程序

在升级老旧LabVIEW程序至64位环境时&#xff0c;需要解决兼容性、性能和稳定性等问题。本文从软件升级、硬件兼容性、程序优化、故障修复等多个角度详细分析。具体包括64位迁移注意事项、修复页面跳转崩溃、解决关闭程序后残留进程的问题&#xff0c;确保程序在新环境中的平稳运…

[Java基本语法] 从0到1带你精通Java基本语法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效 问题背景 使用undetected_chromedriver包驱动浏览器结束后报错句柄无效 Exception ignored in: <function Chrome.del at 0x000001DD50F07A60> Traceback (most recent call last): File “D:…

ESP32 IDF ADF 加入音频

需要把mp3制作成音频bin 用ADF自带工具 果用户需要生成自己的 audio-esp.bin&#xff0c;则需要执行 mk_audio_bin.py 脚本&#xff08;位于 $ADF_PATH/tools/audio_tone/mk_audio_tone.py&#xff09;&#xff0c;并且指定相关文件的路径。 源 MP3 文件在 tone_mp3_folder …

软考-架构设计师-综合知识总结(试卷:2009~2022)(下篇)

说明 本文档对2009到2022年试卷的综合知识进行了归纳总结&#xff0c;同时对叶宏主编的《系统架构设计师教程》划分重点。 第十七章&#xff1a;通信系统架构设计 17.2 考题总结 第十八章&#xff1a;安全架构设计 18.1 重要知识点 18.2 考题总结 第十九章&#xff1a;大数据…

2080. 区间内查询数字的频率

题目&#xff1a; 请你设计一个数据结构&#xff0c;它能求出给定子数组内一个给定值的 频率 。 子数组中一个值的 频率 指的是这个子数组中这个值的出现次数。 请你实现 RangeFreqQuery 类&#xff1a; RangeFreqQuery(int[] arr) 用下标从 0 开始的整数数组 arr 构造一个…

跨国大文件传输需要哪些方面?怎么实现数据快速传输?

跨国大文件传输涉及到许多方面&#xff0c;包括网络速度、安全性、可靠性和法律合规性等。 以下是跨国大文件传输时需要考虑的一些重要方面&#xff1a; 高速稳定的网络连接&#xff1a;确保有足够的带宽和稳定的网络连接以支持大文件的快速传输。这可能需要考虑到跨国网络的延…

JVM 一些常见问题QA

GC Roots 虚拟机栈中引用的对象&#xff1b; 本地方法栈中JNI引用的对象&#xff1b; 方法区中类静态变量引用的对象&#xff1b; 方法区中常量引用的对象&#xff1b; Full GC是Minor GCMajor GC吗&#xff1f; Minor GC&#xff1a;回收年轻代&#xff1b; Major GC&…