1.指针的应用
package main
import (
"fmt"
)
func test(m int) {
var b int = 1000
b += m
}
func main0102() {
var a int = 10
var p *int = &a
a = 100
fmt.Println("a = ", a)
test(10)
*p = 250 // 借助a 变量的地址,操作a对应空间
fmt.Println("a = ", a)
fmt.Println("*p = ", *p)
a = 1000
fmt.Println("*p = ", *p)
}
/*func test() {
p := new(int) // 默认类型的 默认值
*p = 1000
}
func main() {
var a int = 10
fmt.Println("&a", &a)
var p *int
// 在 heap 上申请一片内存地址空间
fmt.Printf("%d\n", *p)
fmt.Printf("%v\n", *p) // 打印Go语言格式的字符串。
}*/
func swap(a, b int) {
a, b = b, a
fmt.Println("swap a:", a, "b:", b)
}
func swap2(x, y *int) {
*x, *y = *y, *x
}
func main01() {
a, b := 10, 20
swap2(&a, &b) // 传地址值。
fmt.Println("swap2: main a:", a, "b:", b)
}
2.切片的使用
package main
import "fmt"
/*func main() {
arr := [10]int {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s := arr[1:3:5]
fmt.Println("s = ", s)
fmt.Println("len(s) = ", len(s))
fmt.Println("cap(s) = ", cap(s))
s := arr[1:5:7]
fmt.Println("s = ", s)
fmt.Println("len(s) = ", len(s)) // 5-1 == 4
fmt.Println("cap(s) = ", cap(s)) // 7-1
s2 := s[0:6]
fmt.Println("s = ", s2)
fmt.Println("len(s) = ", len(s2)) // 6-0 == 6
fmt.Println("cap(s) = ", cap(s2))
}*/
/*func main() {
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s := arr[2:5:5] // {3, 4, 5}
fmt.Println("s=", s)
fmt.Println("len(s)=", len(s))
fmt.Println("cap(s)=", cap(s))
s2 := s[2:7] // {34567} {56789}
fmt.Println("s=", s2)
fmt.Println("len(s)=", len(s2))
fmt.Println("cap(s)=", cap(s2))
}
*/
/*func main() {
// 1. 自动推导赋初值
s1 := []int {1, 2, 4, 6}
fmt.Println("s1 = ", s1)
s2 := make([]int, 5, 10)
fmt.Println("len=", len(s2), "cap=", cap(s2))
s3 := make([]int, 7)
fmt.Println("len=", len(s3), "cap=", cap(s3))
}*/
func main02() {
s1 := []int{
1, 2, 4, 6} // 创建一个有初始值的切片
s1 = append(s1, 888)
s1 = append(s1, 888)
s1 = append(s1, 888)
s1 = append(s1, 888)
s1 = append(s1, 888)
fmt.Println("s1=", s1)
}
3.切片练习(字符串切片拼接)
package main
import "fmt"
func noEmpty(data []string) []string {
out := data[:0] // 在原切片上截取一个长度为 0 的切片 == make([]string, 0)
for _, str := range data {
if str != "" {
out = append(out, str)
}
// 取到空字符串,不作为。
}
return out
}
// 直接在原串上操作
func noEmpty2(data []string) []string {
i := 0
for _, str := range data {
if str != "" {
data[i] = str
i++
}
// 取到空字符串,不作为。
}
return data[:i]
}
func main03() {
// {"red" "black", "pink", "", "", "pink", "blue"}
data := []string{
"red", "", "black", "", "", "pink", "blue"}
afterData := noEmpty2(data)
fmt.Println("afterData:", afterData)
}
4.切片练习(字符串去重)
package main
import "fmt"
func noSame(data []string) []string {
out := data[:1]
// 遍历原始切片字符串
for _, word := range data {
i := 0
// 比较取出的 word 是否在 out 中存在 -- for
for ; i < len(out); i++ {
if word == out[i] {
break
}
}
if i == len(out) {
out = append(out, word)
}
}
return out
}
func main04() {
data := []string{
"red", "black", "red", "yellow", "yellow", "pink", "blue", "pink", "blue"}
afterData := noSame(data)
fmt.Println("Afterdata:", afterData)
}
5.copy函数
package main
import "fmt"
/*func main() {
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := data[8:] // {8, 9}
s2 := data[0:5] // {8, 9, 2 3 4}
copy(s2, s1)
fmt.Println("s2=", s2)
}*/
func remove(data []int, idx int) []int {
copy(data[idx:], data[idx-1:])
fmt.Println(data)
return data[:len(data)-1]
}
func main() {
data := []int{
5, 6, 7, 8, 9} // {5, 6, 8, 9, 9}
afterData := remove(data, 2)
fmt.Println("afterData:", afterData)
}
6.map的使用
package main
import "fmt"
func main06() {
var m1 map[int]string // 声明map ,没有空间,不能直接存储key -- value
//m1[100] = "Green"
if m1 == nil {
fmt.Println("map is nil ")
}
m2 := map[int]string{
} //
fmt.Println(len(m2))
fmt.Println("m2 = ", m2)
m2[4] = "red"
fmt.Println("m2 = ", m2)
m3 := make(map[int]string)
fmt.Println(len(m3))
fmt.Println("m3 = ", m3)
m3[400] = "red"
fmt.Println("m3 = ", m3)
m4 := make(map[int]string, 5) // len
fmt.Println("len(m4) = ", len(m4))
//fmt.Println("len(m4) = ", cap(m4)) // 不能在map中使用 cap()
fmt.Println("m4 = ", m4)
// // 初始化map
// var m5 map[int]string = map[int]string{1:"Luffy", 130:"Sanji", 1301:"Zoro"}
// fmt.Println("m5 = ", m5)
// m6 := map[int]string{1:"Luffy", 130:"Sanji", 1303:"Zoro"}
// fmt.Println("m6 = ", m6)
// m7 := make(map[int]string, 1)
// m7[100] = "Nami"
// m7[20] = "Hello"
// m7[3] = "world"
// fmt.Println("m7=", m7)
// m7[3] = "yellow" // 成功! 将原map中 key 值为 3 的map元素,替换。
// fmt.Println("m7=", m7)
// 遍历map
// var m8 map[int]string = map[int]string{1: "Luffy", 130: "Sanji", 1301: "Zoro"}
// for k, v := range m8 {
// fmt.Printf("key:%d --- value:%q\n", k, v)
// }
// // range返回的key/ value 。 省略value打印。
// for _, K := range m8 {
// fmt.Printf("key:%s\n", K)
// }
// 判断 map 中的key 是否存在
// var m9 map[int]string = map[int]string{1: "Luffy", 130: "Sanji", 1301: "Zoro"}
// if v, has := m9[1]; has { // m9[下标] 返回两个值,第一个是value,第二个是bool 代表key是否存在。
// fmt.Println("value=", v, "has=", has)
// } else {
// fmt.Println("false value=", v, "has=", has)
// }
}
7.map删除
package main
import "fmt"
// map做函数参数、返回值,传引用
func mapDelete(m map[int]string, key int) {
delete(m, key) // 删除 m 中 键值为 key的 map 元素
}
func main07() {
m := map[int]string{
1: "Luffy", 130: "Sanji", 1301: "Zoro"}
fmt.Println("before delete m :", m)
mapDelete(m, 130)
fmt.Println("after delete m :", m)
}
8.map练习
package main
import (
"fmt"
"strings"
)
func wordCountFunc(str string) map[string]int {
s := strings.Fields(str) // 将字符串,拆分成 字符串切片s
m := make(map[string]int) // 创建一个用于存储 word 出现次数的 map
// 遍历拆分后的字符串切片
for i := 0; i < len(s); i++ {
if _, ok := m[s[i]]; ok {
// ok == ture 说明 s[i] 这个key存在
m[s[i]] = m[s[i]] + 1 // m[s[i]]++
} else {
// 说明 s[i] 这个key不存在, 第一次出现。添加到map中
m[s[i]] = 1
}
}
return m
}
func wordCountFunc2(str string) (m map[string]int) {
m = make(map[string]int)
arr := strings.Fields(str)
for _, v := range arr {
m[v]++
}
return
}
func main08() {
str := "I love my work and I I I I love love love my family too"
//mRet := wordCountFunc(str)
mRet := wordCountFunc2(str)
// 遍历map ,展示每个word 出现的次数:
for k, v := range mRet {
fmt.Printf("%q:%d\n", k, v)
}
}