go语言学习(四)

1.指针

2.数组

3.切片

4.字典

一、指针定义,操作

package main
 
import "fmt"
 
func main() {
 
    var a int = 10
 
    //定义一个指针类型的变量
    var p *int
    //&为取地址符,取a的地址赋值给p
    p = &a
 
    fmt.Println(p)
    fmt.Println(&a) //此处打印a的地址与p的值相同
 
    fmt.Println("操作之前a = ", a)
 
    *p = 111 //操作的其实是p所指向的a的内存
 
    fmt.Println("操作之后a = ", a)
 
}

p保存的是a的地址,*p指针指向的是a的内存

二、指针作为参数传递

package main
 
import "fmt"
 
func test_1(a int) {
    a++
}
 
func test_2(a *int) {
    *a++
}
 
func main() {
    var a int
    test_1(a)
    fmt.Println("test_1操作后", a)
    test_2(&a)
    fmt.Println("test_2操作后", a)
}

输出结果为     test_1操作后 0  test_2操作后 1

test_1方法,其传参形式属于值传递,a作为形参,作用域仅在该方法中。test_2方法为地址传递,操作的为a的内存,所以test_2方法会修改a的值,使用指针作为参数传递,可以让主函数知道其他函数所做的操作。

三、数组

数组是同一种类型数据的集合,数组中的每一个数据称为元素。

package main
 
import "fmt"
 
func main() {
 
    //定义一个长度为50的数组
    var a [50]int
 
    //通过for循环向数组中添加元素
    for i := 0; i < len(a); i++ {
        a[i] = i + 1
    }
 
    //通过range迭代a,返回两个参数index为数组下标,data为下标对应的数据
    for index, data := range a {
        fmt.Printf("a[%d]的值为:%d\n", index, data)
    }
 
    //定义一个数组并赋值
    b := [5]int{1, 2, 3, 4, 5}
    fmt.Println(b[2])
 
    b[2] = 666 //修改数组中的第0个元素为666
    fmt.Println(b[2])
 
    //指定数组中的某个元素初始化
    c := [5]int{2: 10}
    fmt.Println(c) //打印结果为[0 0 10 0 0]
}

四、切片

数组的长度在定义之后无法修改,go语言引入切片的设计,通过内部指针和相关属性引用数组片段,实现可变长度。

package main
 
import "fmt"
 
func main() {
 
    //定义一个切片a
    var a []int
 
    fmt.Printf("a 的长度为 %v ,a的容量为 %v \n", len(a), cap(a))
 
    //切片的长度是可变的,当长度与容量相同时,切片会自动扩容,变为当前容量的2倍
    //append方法向切片末尾追加数据
    for i := 0; i < 5; i++ {
        a = append(a, i+1)
        fmt.Printf("a 的长度为 %v ,a的容量为 %v \n", len(a), cap(a))
    }
 
    fmt.Println(a)
 
}
 

打印结果为:

a 的长度为 0 ,a的容量为 0a 的长度为 1 ,a的容量为 1a 的长度为 2 ,a的容量为 2a 的长度为 3 ,a的容量为 4a 的长度为 4 ,a的容量为 4a 的长度为 5 ,a的容量为 8

[1 2 3 4 5]

如果一个切片没有添加数据,并且有长度,初始化时会向切片中添加默认值;

append方法会在切片的末尾追加数据,如果切片中有默认值,就会追加到默认值之后;

package main
 
import "fmt"
 
func main() {
    //定义切片
    a := []int{1, 2, 3, 4, 5}
 
    fmt.Println(a)
 
    //从a中截取下标从1到3的元素,返回的b也是一个切片,长度为3-1,容量为5-1
    b := a[1:3:5]
 
    fmt.Println(b)
    fmt.Printf("b 的长度为 %v ,b 的容量为 %v \n", len(b), cap(b))
 
    //其他定义切片的方法
    //定义一个长度为5,容量为10的切片
    c := make([]int, 5, 10)
    fmt.Printf("c 的长度为 %v ,c 的容量为 %v \n", len(c), cap(c))
 
    //当不指定容量时,默认容量与长度相同
    d := make([]int, 5)
    fmt.Printf("d 的长度为 %v ,c 的容量为 %v \n", len(d), cap(d))
}

进行切片时,容量不能大于模板切片的容量,代码中的b:=a[1:3:5],[]中的数据都不能大于a的容量.

copy函数使用:

package main
 
import "fmt"
 
func main() {
    //定义切片
    a := []int{1, 2}
    b := []int{6, 6, 6, 6, 6, 6}
 
    copy(b, a)
 
    fmt.Println(a)
    fmt.Println(b)
}

输出结果为:

[1 2]
[1 2 6 6 6 6]

copy函数将a切片中的值复制到了b切片中的相应位置

五、字典

map是一种内置的数据结构,它是一个无序的key—value的集合。

声明一个map: var    name    map[keyType] valueType { }

package main
 
import "fmt"
 
func main() {
 
    //map定义
    a := map[int]string{}
 
    fmt.Println("a 的长度:", len(a))
 
    //使用make定义map
    b := make(map[string]string)
 
    fmt.Println("b 的长度:", len(b))
 
}

map的基本操作

package main
 
import "fmt"
import "strconv"
 
func main() {
 
    //map定义
    a := map[int]string{}
 
    //向map中添加数据a[key] = value
    for i := 0; i < 5; i++ {
        a[i] = strconv.Itoa(i)
    }
 
    //遍历map
    for key, value := range a {
        fmt.Printf("a[%d] = %v \n", key, value)
    }
 
    //删除键值为1的元素
    delete(a, 1)
 
    fmt.Println(a)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值