golang 基础第二篇

107 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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))
    }
}
​

1585895660673.png

小结:

  1. 可以使用append进行追加数据
  2. len获取长度,cap获取容量
  3. 如果容量不足,再次追加数据时,会动态分配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)
​
}

1585898372086.png