本文已参与「新人创作礼」活动,一起开启掘金创作之路。
5. 字符串string
package main
import "fmt"
func main() {
//1- 定义
name := "duke"
//需要换行,原生输出字符串时,使用反引号``
usage := `./a.out <option>
-h help
-a xxxx`
//c语言使用单引号 + \来解决
fmt.Println("name :", name)
fmt.Println("usage :", usage)
//2. 长度,访问
//C++: name.length
//GO: string没有.length方法,可以使用自由函数len()进行处理
//len: 很常用
l1 := len(name)
fmt.Println("l1:", l1)
//不需要加()
for i := 0; i < len(name); i++ {
fmt.Printf("i: %d, v: %c\n", i, name[i])
}
//3-拼接
i, j := "hello", "world"
fmt.Println("i+j=", i+j)
//使用const修饰为常量,不能修改
const address = "beijing" //在编译期就确定了类型,是预处理,所以不需要推导
const test = 100
//address = "上海"
fmt.Println("address:", address)
//可以直接对比字符串,使用ASCII的值进行比较
if i > j {
;
}
}
5. 定长数组
package main
import "fmt"
func main() {
//1-定义,定义一个具有10个数字的数组
//c语言定义: int nums[10] ={1,2,3,4}
//go语言定义:
// nums := [10]int{1,2,3,4} (常用方式)
// var nums = [10]int{1,2,3,4}
// var nums [10]int = [10]int{1,2,3,4}
nums := [10]int{1, 2, 3, 4,0,0,0,0}
//2-遍历,方式一
for i := 0; i < len(nums); i++ {
fmt.Println("i:", i, ", j:", nums[i])
}
//方式二: for range ===> python支持
//key是数组下标,value是数组的值
for key, value := range nums {
//key=0, value=1 => nums[0]
value += 1
//value全程只是一个临时变量,不断的被重新赋值,修改它不会修改原始数组
fmt.Println("key:", key, ", value:", value, "num:", nums[key])
}
//在go语言中,如果想忽略一个值,可以使用_
//如果两个都忽略,那么 就不能使用 := ,而应该直接使用 =
for _, value := range nums {
fmt.Println("_忽略key, value:", value)
}
//不定长数组定义
//3-使用make进行创建数组
}
6. 不定长数组(切片、slice)
切片:slice,它的底层也是数组,可以动态改变长度
- 切片1:
package main
import "fmt"
func main() {
//切片:slice,它的底层也是数组,可以动态改变长度
//定义一个切片,包含多个地名
//names := [10]string{"北京", "上海", "广州", "深圳"}
names := []string{"北京", "上海", "广州", "深圳"}
for i, v := range names {
fmt.Println("i:", i, "v:", v)
}
//1.追加数据
names1 := append(names, "海南")
fmt.Println("names:", names)
fmt.Println("names1:", names1)
fmt.Println("追加元素前,name的长度:", len(names), ",容量:", cap(names))
names = append(names, "海南")
//fmt.Println("names追加元素后赋值给自己:", names)
fmt.Println("追加元素后,name的长度:", len(names), ",容量:", cap(names))
names = append(names, "西藏")
fmt.Println("追加元素后,name的长度:", len(names), ",容量:", cap(names))
//2.对于一个切片,不仅有'长度'的概念len(),还有一个'容量'的概念cap()
nums := []int{}
for i := 0; i < 50; i++ {
nums = append(nums, i)
fmt.Println("len:", len(nums), ", cap:", cap(nums))
}
}
小结:
- 可以使用append进行追加数据
- len获取长度,cap获取容量
- 如果容量不足,再次追加数据时,会动态分配2倍空间
- ==切片2:==
package main
import "fmt"
func main() {
names := [7]string{"北京", "上海", "广州", "深圳", "洛阳", "南京", "秦皇岛"}
//想基于names创建一个新的数组
names1 := [3]string{}
names1[0] = names[0]
names1[1] = names[1]
names1[2] = names[2]
//切片可以基于一个数组,灵活的创建新的数组
names2 := names[0:3] //左闭右开
fmt.Println("names2:", names2)
names2[2] = "Hello"
fmt.Println("修改names[2]之后, names2:", names2)
fmt.Println("修改names[2]之后, names:", names)
//1. 如果从0元素开始截取,那么冒号左边的数字可以省略
names3 := names[:5]
fmt.Println("name3:", names3)
//2. 如果截取到数组最后一个元素,那么冒号右边的数字可以省略
names4 := names[5:]
fmt.Println("name4:", names4)
//3. 如果想从左至右全部使用,那么冒号左右两边的数字都可以省略
names5 := names[:]
fmt.Println("name5:", names5)
//4. 也可以基于一个字符串进行切片截取 : 取字符串的字串 helloworld
sub1 := "helloworld"[5:7]
fmt.Println("sub1:", sub1) //'wo'
//5. 可以在创建空切片的时候,明确指定切片的容量,这样可以提高运行效率
//创建一个容量是20,当前长度是0的string类型切片
//make的时候,初始的值都是对应类型的零值 : bool ==> false, 数字==> 0, 字符串 ==> 空
str2 := make([]string, 10, 20) //第三个参数不是必须的,如果没填写,则默认与长度相同
fmt.Println("str2:", &str2[0])
fmt.Println("str2: len:", len(str2), ", cap:", cap(str2))
str2[0] = "hello"
str2[1] = "world"
//6.如果想让切片完全独立于原始数组,可以使用copy()函数来完成
namesCopy := make([]string, len(names))
//func copy(dst, src []Type) int
//names是一个数组,copy函数介收的参数类型是切片,所以需要使用[:]将数组变成切片
copy(namesCopy, names[:])
namesCopy[0] = "香港"
fmt.Println("namesCopy:", namesCopy)
fmt.Println("naemes本身:", names)
}