Go语言进阶第01天(指针切片map进阶)

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

猜你喜欢

转载自blog.csdn.net/qq_51685718/article/details/127622232