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")
	}
}
相关推荐
高频因子挖掘机30 分钟前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
鬼手点金1 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟1 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
孟健1 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
阿里嘎多学长2 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
码事漫谈2 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端
迪飞特科技2 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑2 小时前
@JsonInclude注解使用
spring boot·后端·spring
IT_陈寒3 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信3 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端