概念
将输入的内容赋值给变量
import "fmt"
var s string
var i int
fmt.Scanln("&s")
fmt.Scanln("&i")
golang如何将字符串反转
golang的字符串是不可变量,必须转换为[]rune 或者[]byte 才可以变换位置
参考:
刷题
151.翻转字符串里的单词
使用 strings.Fields(s string) string
使用string截取字节
卡码网 55. 右旋转字符串
思路: 本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分
右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。
此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如图:
总结
双指针总结
programmercarl.com/%E5%8F%8C%E…
slice 切片
slice的数据结构:
type slice struct {
array unsafe.Pointer
len int
cap int
}
slice 的创建
- 使用字面量初始化切片
s := []int{1, 2, 3}
// 这种方式直接声明一个切片并通过大括号将元素值初始化。
- 使用make
s := make([]int, 5)
//这里创建了一个长度为5的切片,并将每个元素都作为int类型的零值
s := make([]int, 5, 10)
//这里创建了一个容量为10,长度为5的切片,5个元素是int类型的零值
- 创建空切片和nil切片
nil切片应该是指没有初始化过的切片,它的指针是nil,长度和容量都是0。而空切片可能是初始化了但里面没有元素的切片,比如用make创建但长度为0,或者直接使用字面量初始化如s := []int{}。这时候切片的指针可能指向一个空数组,或者某个特定的地址,但长度和容量都是0。
var s []int // 分配一个nil切片
s := []int{} // 分配一个空切片
s := make([]int, 0) // 分配一个空切片
slice是值传递
slice在做为参数传递的时候是值传递,列如:
func Test_slice(t *testing.T) {
s := []int{1,2}
fmt.Printf("切片的地址:%p\n", &s)
Zhi(s)
}
func Zhi(s []int) {
fmt.Printf("切片的地址:%p\n", &s)
}
输出为:
切片的地址:0xc000008138
切片的地址:0xc000008168
可以发现两个数组的地址是不同的,slice在作为参数传递的时候,会拷贝一份传递过去
那这里引入一个问题
func Test_slice(t *testing.T) {
s1 := []int{1, 2}
Zhi(s1)
fmt.Printf("切片的地址:%p\n,%v", &s1, s1)
}
func Zhi(s2 []int) {
s2[0] = 2
s2[1] = 1
fmt.Printf("切片的地址:%p\n,%v", &s2, s2)
}
1.这个时候两个数组打印出的元素会是什么?
切片的地址:0xc000008150
,[2 1]
切片的地址:0xc000008138
,[2 1]
按理来说如果是值传递,那么s1打印的应该是[1,2],s2但是的是[2,1],但是很奇怪s1,s2打印的都是[2,1]
这是因为虽然slice是值传递,但是他是浅拷贝,他拷贝的是slice结构体里面三个字段的值,而第一个字段存的是指向数组首位的指针,在拷贝之后依旧指向的是同一个内存地址
导致两个数组实际上是使用的同一片空间,所以在更改s2的值之后,s1也会发生变化
那么对代码进行些许改动这个时候s1,s2输出的又会是什么
func Test_slice(t *testing.T) {
s1 := []int{1, 2}
Zhi(s1)
fmt.Printf("切片的地址s1:%p\n,%v", &s1, s1)
}
func Zhi(s2 []int) {
s2 = append(s2, 1)
s2[0] = 2
s2[1] = 1
fmt.Printf("切片的地址s2:%p\n,%v", &s2, s2)
}
切片的地址s2:0xc000008150
,[2 1 1]
切片的地址s1:0xc000008138
,[1 2]
可以发现对s2添加一个元素之后,s2发生了变化,但是s1没有发生变化