1.string底层是一个byte数组,因此string也可以进行切片处理
//string底层是一个byte数组,故string也可以进行切片处理
str := "hello@atbaidu"
//使用切片获取atbaidu
slice := str[6:]
fmt.Printf("slice=%v\n", slice)
2.string和切片在内存中的形式,以"abcd"画出内存示意图
3. string是不可变的,不能通过str[0] = 'z'方式来修改字符串
//string是不可变的,不能通过str[0] = 'z'方式来修改字符串
str[0] = 'z' //编译不通过,报错:string是不可变的
4.如果需要修改字符串,可以先将string => []byte,或者[]rune => 修改 => 重写转成string
// 如果需要修改字符串,可以先将string => []byte,或者[]rune => 修改 => 重写转成string
//"hello@atbaidu" => 改成 "zello@atbaidu"
arr1 := []byte(str) //先将str转成[]byte切片类型
arr1[0] ='z' //切片类型就可以进行修改了
str = string(arr1) //再把切片转成string类型
fmt.Printf("str=%v\n", str) //str=zello@atbaidu
//细节讨论: 转成[]byte后,可以处理英文和数字,但是不能处理中文
//原因: []byte 字节来处理,而一个汉字占3个字节,所以会出现乱码
// arr2 := []yte(str)
// arr2[0] ='北' //错误: 一个byte的范围为255,而 '北'是21271,越界了
// 解决办法: 将string转成[]rune即可,因为[]rune是按字符处理,兼容汉字
arr2 := []rune(str)
arr2[0] ='北'
str = string(arr2)
fmt.Printf("str=%v\n", str) //str=北ello@atbaidu
练习:
1.可以接收一个n int
2.能够将斐波那契的数列放到切片中
3.提示:斐波那契的数列形式:
arr[0] = 1, arr[1]= 1, arr[2] = 2, arr[3] = 3, arr[4] = 5
package main
import (
"fmt"
)
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
}
func main(){
/**
1.可以接收一个n int
2.能够将斐波那契的数列放到切片中
3.提示:斐波那契的数列形式:
arr[0] = 1, arr[1]= 1, arr[2] = 2, arr[3] = 3, arr[4] = 5
思路:
1.声明一个函数 fbn(n int) ([]uint64)
2.编写fbn(n int) 进行for循环来存放斐波那契数列,注意其中的特殊值arr[0] = 1, arr[1]= 1
*/
slice := fbn(5)
fmt.Printf("slice=%v\n", slice)
}