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")
	}
}
相关推荐
Lee川30 分钟前
从零解剖一个 AI Agent Tool是如何实现的
前端·人工智能·后端
Aurorar0rua38 分钟前
CS50 x 2024 Notes C -14
c语言·开发语言·学习方法
小短腿的代码世界2 小时前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
2401_833269302 小时前
Java网络编程入门
java·开发语言
金銀銅鐵2 小时前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
青瓦梦滋2 小时前
C++的IO流与STL的空间配置器
开发语言·c++
五月君_3 小时前
Bun v1.3.14 发布,Rust 版即将进 Claude Code 内测,下一版可能就告别 Zig
开发语言·后端·rust
明月_清风3 小时前
🍃 MongoDB 从入门到上手:一篇写给新手的科普指南
后端·mongodb
鱼很腾apoc4 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
程序员cxuan4 小时前
当 00 后开始用 token 给学校送礼
人工智能·后端·程序员