目录
[创建 set 类型](#创建 set 类型)
是否包含空格
本实验我们将实现通过正则表达式来判断给定的字符串是否包含空格。
知识点
- 正则表达式
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
对于判断给定的字符串是否包含空格,我们可以使用 regexp 包下的函数来实现,下面是一个例子。
Go
package main
import (
"fmt"
"regexp"
)
func ContainsWhiteSpace(str string) bool {
re := regexp.MustCompile(`\s`)
return re.MatchString(str)
}
func main() {
r1 := ContainsWhiteSpace("lorem") // false
r2 := ContainsWhiteSpace("lorem ipsum") // true
fmt.Println(r1, r2)
}
该程序的功能:
- 使用 regexp.MustCompile 来安全初始化正则表达式。
- 使用 Regexp.MatchString()函数来判断给定的字符串是否包含空格。
将代码保存为/home/project/containsWhiteSpace.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
bash
go run containsWhiteSpace.go
总结
本实验我们学习了如何使用正则表达式来匹配空格,正则表达式在日常学习中是一个非常有用的工具,下个实验我们将学习如何替换字符串。
替换指定范围的字符
本实验我们将通过 strings.Repeat()函数来用指定的掩码字符替换最后 n 个字符以外的所有字符。
知识点
- strings.Repeat
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
Go 语言 Strings 包下的 Repeat 函数可以对输入的字符串和范围进行替换,语法如下:
bash
func Repeat(s string, count int) string
下面我们将使用 Repeat 函数来用指定的掩码字符替换最后 n 个字符以外的所有字符。下面是一个例子。
Go
package main
import (
"fmt"
"strings"
)
func Mask(cc string, n int, m rune) string {
return strings.Repeat(string(m), len(cc)-n) + cc[len(cc)-n:]
}
func main() {
r := Mask("1234567890", 4, '*') // "******7890"
fmt.Println(r)
}
该程序的功能:
- 使用输入的参数对字符串进行切片。
- 使用 strings.Repeat()来对函数进行替换。
将代码保存为/home/project/mask.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
bash
go run mask.go
总结
本实验我们学习了如何使用 strings 包下的 Repeat 来进行替换字符,下个实验我们将学习如何返回最大值。
返回最大值
求最大值是一个经典问题,在 Go 中我们可以使用 math 下的函数快速的解决问题。本实验我们将讲解用这些函数求取最大值。
知识点
- math.Inf
- math.Max
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
下面我们将使用 math 包下的函数来求给定数字切片的最大值,该程序使用了 math 包下的 Inf 和 Max 函数,math.Inf 函数的参数如果大于等于 0,则将正无穷大作为返回值,如果小于 0,则将负无穷大作为返回值。而 math.Max()函数则返回两个浮点数的最大值。下面具体的使用代码。
Go
package main
import (
"fmt"
"math"
)
func MaxOf(nums ...float64) float64 {
max := math.Inf(-1)
for _, num := range nums {
max = math.Max(num, max)
}
return max
}
func main() {
r := MaxOf(3.0, 4.0, 2.0)
fmt.Println(r)
}
该程序的功能:
- 使用
math.Inf(-1)
将初始最大值设置为负无穷大。 - 使用 range 和 math.Max()来遍历每个值并且判断是否是最大值。
将代码保存为/home/project/maxOf.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run maxOf.go
总结
本实验我们学习了如何使用 math.Inf 初始化最大值以及判断最大值的方法,下个实验我们将学习如何反转指定范围的字符串。
反转字符串
本实验中,我们输入一个字符串,然后实现返回反转后的字符串。
知识点
- for
- make
- 转换字符串
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
反转字符串我们可以使用 for 循环加切片来实现,下面是一个例子。
Go
package main
import (
"fmt"
)
func ReverseString(s string) string {
o := make([]rune, len(s))
for i, c := range s {
o[len(s)-i-1] = c
}
return string(o)
}
func main() {
r := ReverseString("hello") // "olleh"
fmt.Println(r)
}
该程序的功能:
- 使用 make 来生成一个 rune 类型的切片。
- 使用 range 和 len 函数来倒序遍历字符串然后将值添加到结果中。
- 使用 string()来将 rune 切片转为字符串。
将代码保存为/home/project/reverseString.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run reverseString.go
总结
本实验我们学习了如何使用 for range 来达到反转字符串的方法,下一个实验我们将学习如何创建 set 类型。
创建 set 类型
Map 的键是一个无序的集合,如果忽略 map 的值,那么 map 就可以作为一个 set。本实验我们将学习如何使用 map 来创建一个 set 类型。
知识点
- map
- key
- value
- struct
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
最省空间的方式是声明一个空结构作为值,下面是一个例子。
Go
package main
import "fmt"
func main() {
set := make(map[string]struct{})
fmt.Println(set)
set["a"] = struct{}{}
set["b"] = struct{}{}
set["c"] = struct{}{}
fmt.Println(set)
if _, exists := set["a"]; exists {
fmt.Println("a exists in the set")
}
delete(set, "b")
fmt.Println(set)
// Output:
// map[]
// map[a:{} b:{} c:{}]
// a exists in the set
// map[a:{} c:{}]
}
该程序的功能:
- 添加一个新的元素到 set 中。
- 判断元素在 set 中是否存在。
- 在 set 中删除一个元素
将代码保存为/home/project/createSet.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run createSet.go
总结
本实验我们学习了如何使用 map 来创建一个 set 类型,下个实验我们讲学习如何把度转换为弧度。
将度转换为弧度
本实验我们将学习如何将度转换为弧度。
知识点
- math.Pi
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
下面我们使用 math.Pi 常量和转换公式来将度转换为弧度,下面是一个例子。
Go
package main
import (
"fmt"
"math"
)
func Rads(d float64) float64 {
return d * math.Pi / 180.0
}
func main() {
r := Rads(90.0) // ~1.5708
fmt.Println(r)
}
该程序的功能:
- 使用 math.Pi 和度数作为参数传入弧度公式,将度数转换为弧度。
将代码保存为/home/project/rads.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run rads.go
总结
本实验我们使用运算公式以及 Math.Pi 常量来将度转换为弧度。Golang 中同样还有 E 的常量 Math.E 和 Pi 的平方根 Math.SqrtPi 等等,下个实验我们将学习如何实现限制数。
限制数
限制数指的是如果输入的数在给定的范围内,则返回该数,否则返回离该数范围最近的范围数。本实验中我们将学习如何获得限制数。
知识点
- math.Max()
- math.Min()
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
下面是一个例子。
Go
package main
import (
"fmt"
"math"
)
func Clamp(n, a, b float64) float64 {
return math.Max(math.Min(n, math.Max(a, b)), math.Min(a, b))
}
func main() {
r1 := Clamp(2.0, 3.0, 5.0) // 3.0
r2 := Clamp(1.0, -1.0, -5.0) // -1.0
fmt.Println(r1, r2)
}
该程序的功能:
- 在函数
Clamp(n, a, b float64)
中如果 n 在 a-b 的范围内,则返回 n。 - 否则返回 ab 中最接近 n 的值。
将代码保存为/home/project/clamp.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run clamp.go
总结
本实验我们学习了如何获得限制数,下个实验我们将判断给定的数字是否为二的幂。
二的幂
求解给定的数字是否为二的幂,本实验中我们将使用 AND 运算符来判断。
知识点
- AND 运算符
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
通过判断二进制下 n 和 n-1 的按位与,我们可以判断该数是否为二的幂,下面是具体的代码。
Go
package main
import (
"fmt"
)
func IsPowerOf2(n int) bool {
return n > 0 && (n&(n-1)) == 0
}
func main() {
r1 := IsPowerOf2(0) // false
r2 := IsPowerOf2(1) // true
r3 := IsPowerOf2(8) // true
fmt.Println(r1, r2, r3)
}
该程序的功能:
- 使用按位二进制 AND 运算符(&)来确定 n 是否为 2 的幂。此外检查 n 是否为零。
将代码保存为/home/project/isPowerOf2.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run isPowerOf2.go
总结
本实验我们学习了使用 AND 运算符来判断给定的数字是否是二的幂,下个实验我们将判断给定的是否为奇数。
判断给定的是否为奇数
本实验我们将学习通过模运算来判断给定的是否为奇数。
知识点
- 模运算
适合人群
本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。
许可证
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。
代码实例
当给定数字与 2 的模为 1 时,我们就说该数字为奇数,下面是一个例子。
Go
package main
import (
"fmt"
)
func IsOdd(n int) bool {
if n < 0 {
n *= -1
}
return n%2 == 1
}
func main() {
r := IsOdd(3) // true
fmt.Println(r)
}
该程序的功能:
- 找使用模运算符%来判断给定的数字能否得到整除。
将代码保存为/home/project/isOdd.go
文件。
运行程序
打开 WebIDE 的 Terminal 终端,输入以下命令查看输出:
go run isOdd.go
总结
本实验我们学习了如何判断给定的数字为奇数,下个实验我们将挑战填充字符串。
填充字符串
挑战介绍
填充字符串为指定长度
挑战内容
本次挑战中,给定一个字符串 s 和长度 l,要求填充字符串长度为 l,填充字符为空格,且右对齐。如初始字符串为"go",长度为 8,则输出字符串为" go"。
挑战要求
- 请自行在环境主目录
/home/project
下新建pad_left.go
文件,并复制示例代码到文件中完成补充。补充完整后点击「提交检测」,系统将会给出判定结果。
示例代码
Go
package main
import (
"fmt"
)
func PadLeft(s string, l int) string {
// 待补充代码
}
func main() {
r := PadLeft("go", 8) // " go"
fmt.Println(r)
}
小贴士
- 为了保证能被系统准确检测,挑战中的每一句话都非常重要,请仔细阅读。跳跃式浏览易导致挑战无法按要求通过。
参考代码
以下内容仅供参考,为了能有更好的学习效果,请尽量按自己的想法来完成挑战。
Go
package main
import (
"fmt"
"strconv"
)
func PadLeft(s string, l int) string {
f := "%" + strconv.Itoa(l) + "v"
return fmt.Sprintf(f, s)
}
func main() {
r := PadLeft("go", 8) // " go"
fmt.Println(r)
}
代码分析:
上述代码实现了一个PadLeft
函数,它接收一个字符串s
和一个整数l
作为参数,通过构造特定的格式化字符串并使用fmt.Sprintf
函数,实现了将字符串s
左填充到指定长度l
的功能。其中,格式化字符串中的v
动词表示按照值的默认格式输出,即直接输出字符串内容,不进行特殊格式化。
版权说明
内容编译来自 psampaz和30s-seconds-of-golang 的开源项目,它们分别使用 CC BY-SA 4.0 License,CC0-1.0 License,为了能够适合实验楼在线环境,我们修改了部分解题和单元测试代码。