Exercise_go_unit_test_是否回文
编写一个回文检测函数,并为其编写单元测试和基准测试,根据测试的结果逐步对其进行优化。(回文:一个字符串正序和逆序一样,如“Madam,I’mAdam”、“油灯少灯油”等。) 来源:李文周blog tip: 要考虑中文则使用 rune // palindrome/palindrome.go package palindrome func IsPalindrome(s string) bool { // 转成 rune, 应对中文等特殊字符 r := []rune(s) l := len(r) for i := 0; i < l/2; i++ { if r[i] != r[l-1-i] { return false } } return true } // palindrome/palindrome_test.go package palindrome import ( "fmt" "testing" ) func TestIsPalindrome(t *testing.T) { type test struct { text string want bool } arr := []test{ {"", true}, {"a", true}, {"aa", true}, {"ab", false}, {"aba", true}, {"abcba", true}, {"abccba", true}, {"abcdabcd", false}, {"Madam,I’mAdam", false}, {"油灯少灯油", true}, } for _, tc := range arr { t.Goroutine 练习题
题目: 使用 goroutine 和 channel 实现一个计算int64随机数各位数和的程序,例如生成随机数61345,计算其每个位数上的数字之和为19。 开启一个 goroutine 循环生成int64类型的随机数,发送到 jobChan 开启24个 goroutine 从jobChan中取出随机数计算各位数的和,将结果发送到resultChan 主 goroutine 从resultChan取出结果并打印到终端输出 题目来源: 李文周blog package main import ( "fmt" "math/rand" "runtime" "time" ) func main() { numChan := make(chan int, 24) resChan := make(chan int) for i := 0; i < 24; i++ { go func() { for num := range numChan { if check19(num) { resChan <- num break } } }() } FOR: for { select { case res := <-resChan: fmt.Go | for...range 中 value 的地址
nums := []int{1, 2, 3} for i := 0; i < len(nums); i++ { fmt.Printf("%p \n", &nums[i]) } for index, num := range nums { fmt.Printf("%p %p \n", &nums[index], &num) } // 0xc00000c150 // 0xc00000c158 // 0xc00000c160 // 0xc0000180e0 0xc00000c150 // 0xc0000180e0 0xc00000c158 // 0xc0000180e0 0xc00000c160 由上可知, 有 for range 遍历中, value 的地址是固定的, 相当于初始化一个变量, 之后每次遍历会把 value 值赋值给该变量 题目: 请问下面代码的执行结果是什么? 题目来源: liwenzhou-blog go语言基础之结构体 type student struct { name string age int } func main() { m := make(map[string]*student) stus := []student{ {name: "小王子", age: 18}, {name: "娜扎", age: 23}, {name: "大王八", age: 9000}, } for _, stu := range stus { m[stu.Go 中 make 与 new 的区别
背景: 在 go 中, 基本类型的变量, 在使用var定义变量, 但是初始化值时, 系统会默认赋初始值, 如 string => “"(空字符串), int => 0, bool => false, 如果是 struct, 也会按 field 的类型(要求 field 的类型也为基本类型)进行初始化 对于 slice, map, channel 这三种类型, 使用 var 定义类型后, 其值为 nil, 不占内存, 所以需要先分配内存, 不能只定义类型后就直接赋值 // map 初始化 map1 := make(map[string]string) // 推荐 map2 := map[string]string{} fmt.Printf("%#v\n", map1) fmt.Printf("%#v\n", map2) // slice 初始化 slice1 := make([]int, 0) slice1 = append(slice1, 1) var slice2 []int slice2 = append(slice2, 1) slice3 := []int{} // 不推荐 slice3 = append(slice3, 1) fmt.Go Defer Return 题 - 李文周
题1: 阅读下面的代码,写出最后的打印结果 来源: 李文周blog - go语言基础之函数 return res 底层实现: 返回值 = x, 如果函数中已定义返回变量名, 则该返回变量 = x 执行返回 遇到 defer 时 return res 底层实现 返回值 = x. 如果函数中已定义返回变量名, 则该返回变量 = x; 如果函数中未指定返回变量名, 则假定返回变量名为 returnValue, 也就有 returnValue = x 执行 defer 的函数 执行 返回 func f1() int { x := 5 defer func() { x++ }() return x } func f2() (x int) { defer func() { x++ }() return 5 } func f3() (y int) { x := 5 defer func() { x++ }() return x } func f4() (x int) { defer func(x int) { x++ }(x) return 5 } func main() { fmt.Go slice 底层数组题
请写出下面代码的输出结果 ⭐⭐⭐⭐ func main() { type Map map[string][]int m := make(Map) s := []int{1, 2} s = append(s, 3) fmt.Printf("%+v\n", s) m["q1mi"] = s s = append(s[:1], s[2:]...) fmt.Printf("%+v\n", s) fmt.Printf("%+v\n", m["q1mi"]) } 问题简化为 s := []int{1, 2, 3} s2 := s fmt.Println(s, s2) s = append(s[:1], s[2:]...) fmt.Println(s, s2) 点击查看 result: [1 2 3] [1 2 3] [1 3] [1 3 3]Go slice 写出代码的运行结果
请写出下面代码的输出结果 func main() { var a = make([]string, 5, 10) for i := 0; i < 10; i++ { a = append(a, fmt.Sprintf("%v", i)) } fmt.Println(a) } 点击查看 make 后 a 已经初始化为 []string{"","","","",""} 之后再 append, 会添加到后面 []string{"","","","","",“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,9"}Find the only number in a list
题: 有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字? 来源: 李文周 Go语言基础之运算符 利用 ^ 二进位异或 运算符 func findTheOnlyNumber(nums []int) (res int) { for index, num := range nums { if index == 0 { res = num } else { res = res ^ num } } return }Number of Chinese in a String
题目: 编写代码统计出字符串"hello沙河小王子"中汉字的数量 题目来源: 李文周blog: Go语言基础之基本数据类型 tips: 字符串用 for 遍历, str[i] 的值是 byte(uint8) 类型, 且下标 i 是连续的, 从 0 到 len(str) 字符串用 for range 遍历, index,value 的值是 rune(int32) 类型, 下标不一定是连续的, 碰到中文只会出现中文的首下标, 然后跳到下一个 rune 字符 func getChineseCharNumInAString(str string) (num int) { for i, r := range str { if byte(r) == str[i] { continue } num++ } return num }
Recent Posts
Tags
- apache 4
- axios 1
- benchmark 1
- c 1
- canvas 1
- centos 3
- channel 1
- crontab 1
- css 2
- docker 4
- fail2ban 1
- frp 1
- gin 1
- github 1
- go 26
- goaccess 1
- goroutine 1
- http 1
- https 1
- jetbrains 1
- jquery 1
- js 2
- linux 20
- mermaid 1
- mysql 10
- nginx 3
- node 1
- php 43
- prisma 1
- react 8
- server 1
- ssh 2
- tarojs 1
- tcp/ip 1
- token 1
- ubuntu 1
- ufw 1
- unit-test 1
- vmware 1
- vscode 1
- vue 12
- yum 1
- 域名 3
- 安全 2
- 微信 3
- 算法 3