Go语言之前在写6.824的时候用过,现在单独拿出来学习一下,主要学习方式以在codewar做题为主
Vowel Count
https://www.codewars.com/kata/54ff3102c1bad923760001f3/train/go
这道题主要是借助于strings
库中的strings.ContainsAny
函数。官网上解答有借助于switch
的,
1 | for _, c := range str { |
还有借助于strings.Count
单独统计每一个元音的数量的
1 | vowels := []string{"a", "e", "i", "o", "u"} |
Two to One
https://www.codewars.com/kata/5656b6906de340bd1b0000ac/train/go
本题涉及排序和去重,主要是对string类型的理解。string
实际上是只读的byte的slice。string
可以和[]byte
进行互转。
在下面的代码中遇到报错,说rune
和byte
的type是mismatch的。这是因为当使用for range遍历字符串时,每一次迭代得到一个UTF-8编码的rune
对象,这个是和用index遍历不一样的。
1 | for i, x := range(tot){ |
看了一下大众的答案,写的比我好。它使用strings.Split
将字符串变成数组,再使用sort.Strings
来排序,这样可以避免我上面操作rune
和byte
的困扰
1 | func TwoToOne(s1 string, s2 string) (res string) { |
Function 1 - hello world
https://www.codewars.com/kata/523b4ff7adca849afe000035/train/go
go语言里面有个带变量名的返回值的特性,也就是说,我们可以在函数体中对函数返回值直接进行赋值,这有点类似VB6的特性了。
1 | func greet() (hello string) { |
Multiples of 3 or 5
https://www.codewars.com/kata/514b92a657cdc65150000006/train/go
输出所有小于指定数的,有3或者5的因子的数的和。简单题。
Highest Scoring Word
https://www.codewars.com/kata/57eb8fcdf670e99d9b000272/train/go
貌似sort.Sort
不是稳定排序,所以不能靠排序解决。
本题主要是几点:
- 创建动态长度的数组,一般用
make([]int, length)
这样,似乎new
和var
都不行 - 利用
math.Max
比较大小,会遇到cannot use math.Max(score[i], mx) (type float64) as type int in assignment
的错误,查了一下,似乎go没有提供内置的整型的大小比较函数。。。
Valid Braces
https://www.codewars.com/kata/5277c8a221e209d3f6000b56/train/go
一个简单的括号匹配问题,主要涉及了下面的知识
创建并初始化map,这个方法有点类似于C++,其中中括号里面的是Key
1
var lookup map[rune] rune = map[rune] rune{'{': '}', '[': ']', '(': ')'}
栈
一般通过对一个动态大小的数组进行append和slice操作来实现1
2
3
4
5s := []rune{}
// 添加元素到尾部
s = append(s, x)
// 删除尾部元素
s = s[:len(s)-1]switch语句和C/C++差不多形式,但不需要显式break了
1
2
3
4
5
6switch x{
case '{', '[', '(':
s = append(s, x)
case '}', ']', ')':
...
}