2.Go的基本语法-指针、结构体、Map

1.指针

1.1.常规定义

go 复制代码
func test24() {
	var a int = 10
	var b *int
	b = &a
	fmt.Printf("a 的 值%d\n", a)
	fmt.Printf("a 的 指针地址%x\n", &a)
	fmt.Printf("b 的 值%d\n", *b)
	fmt.Printf("b 的 指针地址%x\n", b)打印
	var c *string
	if c == nil {
		println("c is null")
	} else {
		println("c is not null")
	}
}

结果:

go 复制代码
a 的 值10
a 的 指针地址c0001140d0
b 的 值10
b 的 指针地址c0001140d0
c is null

说明 :

如果变量类型为指针,使用*b来获取值

如果类型直接是指针, 使用&b获取地址

打印的时候, 使用%x打印地址, 使用%d打印数字,使用%s打印字符串

1.2.指针数组

go 复制代码
func test25() {
	var d = [3]int{1, 2, 3}
	var e [3]*int
	for i := 0; i < len(d); i++ {
		e[i] = &d[i]
	}
	for i := 0; i < len(d); i++ {
		fmt.Printf("d[%d] = %d\n", i, *e[i])
	}
}

结果:

go 复制代码
d[0] = 1
d[1] = 2
d[2] = 3

1.3.指针的指针

go 复制代码
func test26() {
	var a int = 10
	var b *int
	var c **int
	b = &a
	c = &b
	fmt.Printf("b = %d\n", *b)
	fmt.Printf("c = %d\n", **c)
}

结果:

go 复制代码
b = 10
c = 10

说明 :

b为指针, 所以获取值的时候, 使用*b获取

c为指针的指针, 获取值的时候, 使用**c获取

1.4.指针形参

go 复制代码
func test27() {
	var a = 10
	var b = 20
	c := test27V1(&a, &b)
	fmt.Printf("c = %d\n", c)
}

func test27V1(a *int, b *int) int {
	return *a * *b
}

结果:

go 复制代码
c = 200

2.结构体(实体类)

go 复制代码
type StructA struct {
	param1 int
	param2 string
	param3 bool
	param4 StructB
	param5 *int
	param6 *StructB
}

type StructB struct {
	param1 int
}

func test28() {
	var a StructA
	a.param1 = 1
	a.param2 = "a"
	a.param3 = true

	var b StructB
	b.param1 = 10
	a.param4 = b

	c := 20
	a.param5 = &c

	var d StructB
	d.param1 = 30
	a.param6 = &d

	fmt.Printf("param1 value is [%d]\n", a.param1)
	fmt.Printf("param2 value is [%s]\n", a.param2)
	fmt.Printf("param3 value is [%t]\n", a.param3)
	fmt.Printf("param4 value is [%v, %+v, %#v]\n", a.param4, a.param4, a.param4)
	fmt.Printf("param5 value is [%p, %#p]\n", a.param5, a.param5)
	fmt.Printf("param1 value is [%d]\n", a.param6.param1)
}

结果:

go 复制代码
param1 value is [1]
param2 value is [a]
param3 value is [true]
param4 value is [{10}, {param1:10}, main.StructB{param1:10}]
param5 value is [0xc0000a60d8, c0000a60d8]
param1 value is [30]

3.Map

3.1.Map值的获取

go 复制代码
func test33() {
	m := make(map[string]int)
	m["key1"] = 1
	m["key2"] = 2
	m["key3"] = 3
	
	fmt.Printf("key1's value is %d\n", m["key1"])
	fmt.Printf("m's length is %d\n", len(m))
	
	key4, status := m["key4"]
	if status {
		fmt.Println("key4 value is ", key4)
	} else {
		fmt.Println("key4 is not exist.")
	}
}

结果:

go 复制代码
key1's value is 1
m's length is 3
key4 is not exist.

说明 :

直接获取map的值的时候, 返回的第二个参数为:是否存在, bool类型

3.2.Map的遍历

go 复制代码
func test33() {
	m := make(map[string]int)
	m["key1"] = 1
	m["key2"] = 2
	m["key3"] = 3

	for key, value := range m {
		fmt.Printf("1--->key is %s, value is %d\n", key, value)
	}

	n := map[string]string{"a": "value1", "b": "value2", "c": "value3"}
	for key, value := range n {
		fmt.Printf("2--->key is %s, value is %s\n", key, value)
	}
}

结果:

go 复制代码
1--->key1's value is 1
1--->key is key3, value is 3
1--->key is key1, value is 1
1--->key is key2, value is 2
2--->key is c, value is value3
2--->key is a, value is value1
2--->key is b, value is value2

说明 :

map 遍历的时候, 顺序不是固定的

3.3.删除和清空

go 复制代码
func test34() {
	n := map[string]string{"a": "value1", "b": "value2", "c": "value3"}
	delete(n, "a")

	for key, value := range n {
		fmt.Printf("key is %s, value is %s\n", key, value)
	}

	clear(n)
	fmt.Println("n map: ", n)
}

结果:

go 复制代码
key is b, value is value2
key is c, value is value3
n map:  map[]

3.4.判断两个map是否相等

go 复制代码
package main

import (
	"fmt"
	"maps"
)

func test35() {
	m := map[string]string{"a": "value1", "b": "value2", "c": "value3"}
	n := map[string]string{"a": "value1", "b": "value2", "c": "value3"}

	if maps.Equal(m, n) {
		fmt.Println("m == n")
	}
}
相关推荐
Knight_AL5 分钟前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
利威尔xu20 分钟前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
FRing0340 分钟前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
逃逸线LOF1 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
by209991 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河1 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间1 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu1 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
IT召唤狮1 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻1 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件