2022-4-28 实习Day26

1、汇款业务-汇出汇款测试文档编写完毕 –3小时 100%
2、汇款业务-行内汇款业务手动测试。–2小时 100%
3、bugFix4-27测试问题全部检验测试解决。–2小时 90%

Golang编程学习(part 21)

1、string和slice的相关解释

① string底层是一个byte数组, 因此string也可以进行切片处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import "fmt"
func main() {
// string底层是一个byte数组, 因此string也可以进行切片处理
str := "hello@atguigu"

// 使用切片获取到 atguigu
slice := str[6:]
fmt.Println("slice=", slice)
fmt.Printf("%T", slice)
}

slice= atguigu
string

② string和切片在内存的形式, 以”abcd”画出内存示意图
1
2
3
4
5
6
7
8
   str --> [  0x0010  |  4  ]    string
|
\|/
[ a | b | c | d ] [4]byte
/|\
|
slice = str[1,3] -->[ 0x0014 | 2 ]
ptr len
③ string是不可变的, 也就是说不能通过 str[0] = ‘z’ 的方式来修改字符串
1
2
// string是不可变的, 也就是说不能通过 str[0] = 'z' 方式来修改字符串
str[0] = 'z'
④ 如果需要修改字符串, 可以先将 string ——> []byte 或者 []rune ——> 修改 ——> 重写转成 string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main
import "fmt"
func main() {

str := "sdlsfn"
fmt.Println(&str)

arr := []byte(str)
arr[0] = 'z'
fmt.Println(&arr[0])

t := string(arr)
fmt.Println(&t)

// 细节, 我们转成[]byte后, 可以处理英文和数字, 但是不能处理中文
// 原因是 []byte 字节来处理, 而一个汉字是3个字节, 因此就会出现乱码
// 解决方法是将 string 转成 []rune 即可, 因为 []rune 是按字符处理, 兼容汉字
str1 := "go语言真不错"
arr1 := []rune(str)
arr1[0] = '北'
str1 := string(arr1)
fmt.Println("str=", str)

str1 := "go语言真不错"
arr1 := []rune(str1)
arr1[0] = '北'
str2 := string(arr1)
fmt.Println("str=", str1)
fmt.Println("str=", str2)
}
0xc000088220
0xc0000aa058
0xc000088230

str= go语言真不错
str= 北o语言真不错



2、切片的练习题

说明:编写一个函数 fbn(n int) ,要求完成

  1. 可以接收一个 n int

  2. 能够将斐波那契的数列放到切片中

  3. 提示, 斐波那契的数列形式:

arr[0] = 1; arr[1] = 1; arr[2]=2; arr[3] = 3; arr[4]=5; arr[5]=8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 方式1:不用递归, 做算法能不用递归就不用, 因为递归有栈溢出风险
package main
import "fmt"
func main() {
fbn(10)
}

func fbn(n int) {
var ints []int
this, pre := 0, 0
for i := 0; i <= n; i++ {
if i == 0 {
ints, this = append(ints, 1), 1
} else if i == 1 {
ints, pre, this = append(ints, 1), 1, 1
} else {
pre, this = this, pre+this
ints = append(ints, this)
}
}
fmt.Println(ints)
}

[1 1 2 3 5 8 13 21 34 55 89]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 方式2:使用递归
func fbn(n int) ([]uint64) {
// 声明一个切片, 切片大小 n
fbnSlice := make([]uint64, n)

// 第一个和第二个数的斐波那契为 1
fbnSlice[0] = 1
fbnSlice[1] = 1

//进行for循环来放斐波那契数列
for i := 2; i < n; i++ {
fbnSlice[i] = fbnSlice[i - 1] + fbnSlice[i - 2]
}
return fbnSlice
}