1.值类型和指针类型:
可以用"*"来声明一个变量是指针类型的数据(常量的值不可变,因此不能声明为指针类型).指针存储的是内存地址,而内存地址指向真实存储的数据内容.
可以用&操作符来获取某个变量或者常量的内存地址,从而产生一个指针.
1.1demo:
package main
import "fmt"
func main() {
// 值变量
var a = 2665
fmt.Println("值类型a的内容是:", a, "\n")
var b = 65536
// 指针变量p
p := &b
fmt.Println("指针类型p的内容:", p)
}
执行结果:
可以看出指针p打印出来的其实是一个内存地址值.
2.切片(slice)
切片可以看做是大小可变的数组.
2.1make函数创建切片:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
}
利用make函数创建了一个长度为5,容量为10的int类型的切片.
执行结果:
2.2切片元素:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
for i := 0; i < len(s); i++ {
s[i] = i
}
for _, e := range s {
fmt.Println(e)
}
}
执行结果:
2.3切片长度扩展:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
s = append(s, 5, 6, 7, 8, 9)
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
}
执行结果:
2.4切片容量的扩展:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
fmt.Printf("切片地址:%p\n", s)
s = append(s, 5, 6, 7, 8, 9)
fmt.Printf("切片追加元素,未超过容量地址:%p\n", s)
s = append(s, 10, 11)
fmt.Printf("切片追加元素,超过容量地址:%p\n", s)
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
}
执行结果:
超过容量后,切片的地址变化了.说明容量的扩充是底层数组的重新创建来实现的.
2.5切片的复制:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("s 初始长度:%d 初始容量:%d\n", len(s), cap(s))
_ = append(s, 5, 6, 7, 8, 9)
fmt.Printf("追加后s长度:%d 初始容量:%d\n", len(s), cap(s))
s1 := append(s, 10)
fmt.Printf("追加后s长度:%d 初始容量:%d\n", len(s), cap(s))
fmt.Printf("追加后s长度:%d 初始容量:%d\n", len(s1), cap(s1))
}
执行结果:
编辑
通过执行结果可以看出,append函数内部并没有改变原始切片的值.只能通过重新赋值 来改变原来的切片.
2.6数组创建切片:
package main
import "fmt"
func main() {
array := [5]int{1, 2, 3, 4, 5}
fmt.Printf("数组地址:%p\n", &array)
s := array[:]
fmt.Printf("切片的长度:%d\n", len(s))
fmt.Printf("切片的容量:%d\n", cap(s))
fmt.Printf("切片地址:%p\n", s)
s1 := array[1:3]
fmt.Printf("切片的长度:%d\n", len(s1))
fmt.Printf("切片的容量:%d\n", cap(s1))
fmt.Printf("切片地址:%p\n", s1)
}
执行结果:
2.7:切片创建切片:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("切片地址:%p\n", s)
s1 := s[1:]
fmt.Printf("切片地址:%p\n", s1)
}
执行结果:
2.8切片元素修改:
package main
import "fmt"
func main() {
s := make([]int, 5, 10)
fmt.Printf("切片地址:%p\n", s)
s1 := s[1:]
s1[1] = 100
fmt.Println("s=", s)
fmt.Println("s1=", s1)
fmt.Printf("切片地址:%p\n", s1)
}
执行结果:
因为他们所在元素的地址是一样的,所以修改了一个元素的值,对应的也会被修改.
2.9切片循环处理:
package main
import "fmt"
func main() {
array := [5]int{1, 2, 3, 4, 5}
s1 := array[1:3]
for i, e := range s1 {
fmt.Printf("第%d个元素为:%d\n", i, e)
}
}
执行结果:
3.map(映射)
3.1make函数创建map:
m := make(map[string]int)
[]里的是key的类型,int是value的类型.
3.2遍历map:
package main
import "fmt"
func main() {
m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m["c"] = 3
for k, v := range m {
fmt.Printf("key的值为%s,value值为%d\n", k, v)
}
}
执行结果:
3.3map元素查找:
package main
import "fmt"
func main() {
m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m["c"] = 3
for k, v := range m {
fmt.Printf("key的值为%s,value值为%d\n", k, v)
}
flag := m["d"]
fmt.Println(flag)
}
执行结果:
如果元素不存在就会返回一个0.
3.4map删除元素:
package main
import "fmt"
func main() {
m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m["c"] = 3
for k, v := range m {
fmt.Printf("key的值为%s,value值为%d\n", k, v)
}
delete(m, "a")
for k, v := range m {
fmt.Printf("删除后key的值为%s,删除后value值为%d\n", k, v)
}
}
执行结果:
语雀地址www.yuque.com/itbosunmian…?
《Go.》 密码:xbkk 欢迎大家访问.提意见.