在 Go 语言(Golang)中,*& 是与指针相关的两个重要操作符。

  • 理解它们对于掌握 Go 的内存管理和函数参数传递机制非常关键。

文章目录

    • 一、`&` 操作符:取地址(Address-of)
      • 示例:
    • 二、`*` 操作符:解引用(Dereference)
      • 示例:
    • 三、指针类型声明:`*T`
      • 示例:
    • 四、使用场景
      • 1. 函数中修改原变量(传引用)
      • 2. 避免大结构体拷贝
    • 五、new 函数创建指针
    • 六、nil 指针与安全
    • 七、常见误区
    • 八、总结
    • 九、小练习
    • 十、额外提示
  • Go语言中 `*` 和 `&` 操作符详解 - 代码演示
    • 1. 基础概念演示
    • 2. 指针的基本操作
    • 3. 指针与函数 - 修改原值
    • 4. 指针与结构体
    • 5. 指针数组和数组指针
    • 6. 多级指针
    • 7. 指针的实际应用场景
    • 8. 指针陷阱和注意事项
    • 总结


一、& 操作符:取地址(Address-of)

& 用于获取一个变量的内存地址

示例:

package mainimport "fmt"func main() {x := 10fmt.Println("x 的值:", x)           // 输出: 10fmt.Println("x 的地址:", &x)        // 输出: 0xc00001a0a0 (类似这样的地址)
}
  • &x 表示“变量 x 的内存地址”。
  • 结果是一个指针类型,例如 *int(指向 int 的指针)。

二、* 操作符:解引用(Dereference)

* 用于访问指针所指向的值

示例:

package mainimport "fmt"func main() {x := 10p := &x          // p 是一个 *int 类型的指针,指向 xfmt.Println(*p)  // 输出: 10,*p 表示“p 指向的值”*p = 20          // 修改 p 指向的值fmt.Println(x)   // 输出: 20,x 也被修改了
}
  • *p 表示“指针 p 所指向的变量的值”。
  • 可以通过 *p = 20 来修改原变量的值。

三、指针类型声明:*T

在 Go 中,指针的类型是 *T,表示“指向类型为 T 的变量的指针”。

示例:

var p *int    // p 是一个指向 int 的指针
var s *string // s 是一个指向 string 的指针

未初始化的指针默认值是 nil

var p *int
fmt.Println(p) // 输出: <nil>

四、使用场景

1. 函数中修改原变量(传引用)

Go 中函数参数是值传递,如果想在函数中修改原变量,需要传指针。

func increment(p *int) {*p = *p + 1
}func main() {x := 5increment(&x)fmt.Println(x) // 输出: 6
}
  • 传入 &x 把地址传给函数。
  • 函数内用 *p 修改原值。

2. 避免大结构体拷贝

传递大型结构体时,使用指针可以避免复制整个结构体,提高性能。

type User struct {Name stringAge  int
}func printUser(u *User) {fmt.Printf("Name: %s, Age: %d\n", u.Name, u.Age)
}func main() {user := User{Name: "Alice", Age: 30}printUser(&user) // 传指针
}

注意:Go 允许通过指针直接访问结构体字段(u.Name 等价于 (*u).Name),这是语法糖。


五、new 函数创建指针

Go 提供 new(T) 函数来分配内存并返回指向该类型零值的指针。

p := new(int)   // 分配一个 int 的内存,初始化为 0
*p = 10
fmt.Println(*p) // 输出: 10

等价于:

var temp int
p := &temp

六、nil 指针与安全

未初始化或指向无效地址的指针是 nil,解引用 nil 指针会引发 panic。

var p *int
fmt.Println(*p) // panic: runtime error: invalid memory address or nil pointer dereference

使用前应确保指针非 nil。


七、常见误区

写法含义
&x取变量 x 的地址
*p获取指针 p 指向的值(解引用)
*int指针类型,指向 int 的指针
p := &xp 是一个 *int,指向 x
*p = 5修改 p 所指向的变量的值

八、总结

符号名称作用示例
&取地址符获取变量的内存地址p := &x
*解引用符访问指针所指向的值value := *p
*T指针类型声明一个指向类型 T 的指针var p *int

九、小练习

func main() {a := 5b := &a*b = *b + 10fmt.Println(a) // 输出什么?
}

✅ 输出:15


十、额外提示

  • Go 没有指针运算(不像 C/C++),不能进行 p++ 这样的操作。
  • Go 的垃圾回收机制会自动管理内存,无需手动释放指针指向的内存。
  • 尽量使用值语义,仅在需要修改原值或优化性能时使用指针。

在这里插入图片描述


文章目录

    • 一、`&` 操作符:取地址(Address-of)
      • 示例:
    • 二、`*` 操作符:解引用(Dereference)
      • 示例:
    • 三、指针类型声明:`*T`
      • 示例:
    • 四、使用场景
      • 1. 函数中修改原变量(传引用)
      • 2. 避免大结构体拷贝
    • 五、new 函数创建指针
    • 六、nil 指针与安全
    • 七、常见误区
    • 八、总结
    • 九、小练习
    • 十、额外提示
  • Go语言中 `*` 和 `&` 操作符详解 - 代码演示
    • 1. 基础概念演示
    • 2. 指针的基本操作
    • 3. 指针与函数 - 修改原值
    • 4. 指针与结构体
    • 5. 指针数组和数组指针
    • 6. 多级指针
    • 7. 指针的实际应用场景
    • 8. 指针陷阱和注意事项
    • 总结

Go语言中 *& 操作符详解 - 代码演示

1. 基础概念演示

package mainimport ("fmt""unsafe"
)func main() {// 声明一个整数变量x := 42fmt.Println("=== 基础概念 ===")fmt.Printf("变量 x 的值: %d\n", x)fmt.Printf("变量 x 的地址: %p\n", &x)fmt.Printf("变量 x 的大小: %d 字节\n", unsafe.Sizeof(x))// 使用 & 操作符获取地址ptr := &xfmt.Printf("ptr (指向 x 的指针): %p\n", ptr)fmt.Printf("ptr 的类型: %T\n", ptr)// 使用 * 操作符解引用fmt.Printf("*ptr (ptr 指向的值): %d\n", *ptr)
}

输出:

=== 基础概念 ===
变量 x 的值: 42
变量 x 的地址: 0xc00001a0a0
变量 x 的大小: 8 字节
ptr (指向 x 的指针): 0xc00001a0a0
ptr 的类型: *int
*ptr (ptr 指向的值): 42

2. 指针的基本操作

package mainimport "fmt"func main() {fmt.Println("=== 指针的基本操作 ===")// 声明并初始化变量num := 100fmt.Printf("原始值 num = %d\n", num)// 获取指针ptr := &numfmt.Printf("ptr = %p, *ptr = %d\n", ptr, *ptr)// 通过指针修改值*ptr = 200fmt.Printf("通过指针修改后: num = %d, *ptr = %d\n", num, *ptr)// 声明空指针var nilPtr *intfmt.Printf("空指针: %v\n", nilPtr)// 创建指针的几种方式var a int = 50var p1 *int = &a        // 显式声明p2 := &a                // 简短声明p3 := new(int)          // 使用 new 函数*p3 = 75fmt.Printf("p1 指向的值: %d\n", *p1)fmt.Printf("p2 指向的值: %d\n", *p2)fmt.Printf("p3 指向的值: %d\n", *p3)
}

输出:

=== 指针的基本操作 ===
原始值 num = 100
ptr = 0xc00001a0a8, *ptr = 100
通过指针修改后: num = 200, *ptr = 200
空指针: <nil>
p1 指向的值: 50
p2 指向的值: 50
p3 指向的值: 75

3. 指针与函数 - 修改原值

package mainimport "fmt"// 值传递 - 不会修改原值
func addByValue(x int) {x = x + 10fmt.Printf("函数内部 x = %d\n", x)
}// 指针传递 - 会修改原值
func addByPointer(x *int) {*x = *x + 10fmt.Printf("函数内部 *x = %d\n", *x)
}// 返回指针的函数
func createPointer() *int {value := 42return &value  // 返回局部变量的地址(Go 允许这样做)
}func main() {fmt.Println("=== 指针与函数 ===")// 值传递示例a := 5fmt.Printf("调用前 a = %d\n", a)addByValue(a)fmt.Printf("调用后 a = %d\n", a)fmt.Println("---")// 指针传递示例b := 5fmt.Printf("调用前 b = %d\n", b)addByPointer(&b)fmt.Printf("调用后 b = %d\n", b)// 使用返回指针的函数ptr := createPointer()fmt.Printf("createPointer 返回的值: %d\n", *ptr)
}

输出:

=== 指针与函数 ===
调用前 a = 5
函数内部 x = 15
调用后 a = 5
---
调用前 b = 5
函数内部 *x = 15
调用后 b = 15
createPointer 返回的值: 42

4. 指针与结构体

package mainimport "fmt"type Person struct {Name stringAge  int
}// 值接收者 - 不修改原对象
func (p Person) celebrateBirthdayByValue() Person {p.Age++fmt.Printf("函数内部: %s 的年龄变为 %d\n", p.Name, p.Age)return p
}// 指针接收者 - 修改原对象
func (p *Person) celebrateBirthdayByPointer() {p.Age++fmt.Printf("函数内部: %s 的年龄变为 %d\n", p.Name, p.Age)
}// 修改结构体字段的函数
func updatePersonName(p *Person, newName string) {p.Name = newName
}func main() {fmt.Println("=== 指针与结构体 ===")// 创建结构体person := Person{Name: "Alice", Age: 25}fmt.Printf("初始状态: %+v\n", person)// 值接收者方法fmt.Println("\n--- 值接收者方法 ---")updatedPerson := person.celebrateBirthdayByValue()fmt.Printf("调用后 person: %+v\n", person)fmt.Printf("返回的 updatedPerson: %+v\n", updatedPerson)// 指针接收者方法fmt.Println("\n--- 指针接收者方法 ---")person.celebrateBirthdayByPointer()fmt.Printf("调用后 person: %+v\n", person)// 通过指针修改结构体fmt.Println("\n--- 通过指针修改结构体 ---")updatePersonName(&person, "Alice Smith")fmt.Printf("修改后 person: %+v\n", person)// 结构体指针的声明和使用fmt.Println("\n--- 结构体指针 ---")var personPtr *PersonpersonPtr = &personfmt.Printf("personPtr 指向: %+v\n", *personPtr)// Go 的语法糖:可以直接通过指针访问字段fmt.Printf("personPtr.Name = %s\n", personPtr.Name)  // 等价于 (*personPtr).Namefmt.Printf("(*personPtr).Name = %s\n", (*personPtr).Name)
}

输出:

=== 指针与结构体 ===
初始状态: {Name:Alice Age:25}--- 值接收者方法 ---
函数内部: Alice 的年龄变为 26
调用后 person: {Name:Alice Age:25}
返回的 updatedPerson: {Name:Alice Age:26}--- 指针接收者方法 ---
函数内部: Alice 的年龄变为 26
调用后 person: {Name:Alice Smith Age:26}--- 通过指针修改结构体 ---
修改后 person: {Name:Alice Smith Age:26}--- 结构体指针 ---
personPtr 指向: {Name:Alice Smith Age:26}
personPtr.Name = Alice Smith
(*personPtr).Name = Alice Smith

5. 指针数组和数组指针

package mainimport "fmt"func main() {fmt.Println("=== 指针数组和数组指针 ===")// 普通数组arr := [3]int{10, 20, 30}fmt.Printf("原始数组: %v\n", arr)// 指针数组 - 数组的每个元素都是指针fmt.Println("\n--- 指针数组 ---")var ptrArray [3]*intfor i := range arr {ptrArray[i] = &arr[i]}fmt.Printf("指针数组: [%p, %p, %p]\n", ptrArray[0], ptrArray[1], ptrArray[2])fmt.Printf("通过指针数组访问值: [%d, %d, %d]\n", *ptrArray[0], *ptrArray[1], *ptrArray[2])// 修改原数组,观察指针数组的变化arr[0] = 100fmt.Printf("修改 arr[0] 后,通过指针数组访问: [%d, %d, %d]\n", *ptrArray[0], *ptrArray[1], *ptrArray[2])// 数组指针 - 指向整个数组的指针fmt.Println("\n--- 数组指针 ---")var arrPtr *[3]int = &arrfmt.Printf("数组指针 arrPtr: %p\n", arrPtr)fmt.Printf("*arrPtr: %v\n", *arrPtr)fmt.Printf("通过数组指针访问元素: %d, %d, %d\n", (*arrPtr)[0], (*arrPtr)[1], (*arrPtr)[2])// 修改通过数组指针(*arrPtr)[1] = 200fmt.Printf("修改后原数组: %v\n", arr)
}

输出:

=== 指针数组和数组指针 ===
原始数组: [10 20 30]--- 指针数组 ---
指针数组: [0xc00001a080, 0xc00001a088, 0xc00001a090]
通过指针数组访问值: [10, 20, 30]
修改 arr[0] 后,通过指针数组访问: [100, 20, 30]--- 数组指针 ---
数组指针 arrPtr: 0xc00001a080
*arrPtr: [100 20 30]
通过数组指针访问元素: 100, 20, 30
修改后原数组: [100 200 30]

6. 多级指针

package mainimport "fmt"func main() {fmt.Println("=== 多级指针 ===")// 一级指针a := 42ptr1 := &afmt.Printf("变量 a = %d, 地址 = %p\n", a, &a)fmt.Printf("一级指针 ptr1 = %p, *ptr1 = %d\n", ptr1, *ptr1)// 二级指针ptr2 := &ptr1fmt.Printf("二级指针 ptr2 = %p, *ptr2 = %p, **ptr2 = %d\n", ptr2, *ptr2, **ptr2)// 三级指针ptr3 := &ptr2fmt.Printf("三级指针 ptr3 = %p, ***ptr3 = %d\n", ptr3, ***ptr3)// 通过多级指针修改值fmt.Println("\n--- 通过多级指针修改值 ---")fmt.Printf("修改前: a = %d\n", a)**ptr2 = 99  // 等价于 *ptr1 = 99,等价于 a = 99fmt.Printf("通过 **ptr2 修改后: a = %d\n", a)***ptr3 = 199  // 等价于 a = 199fmt.Printf("通过 ***ptr3 修改后: a = %d\n", a)
}

输出:

=== 多级指针 ===
变量 a = 42, 地址 = 0xc00001a0a8
一级指针 ptr1 = 0xc00001a0a8, *ptr1 = 42
二级指针 ptr2 = 0xc000006028, *ptr2 = 0xc00001a0a8, **ptr2 = 42
三级指针 ptr3 = 0xc000006038, ***ptr3 = 42--- 通过多级指针修改值 ---
修改前: a = 42
通过 **ptr2 修改后: a = 99
通过 ***ptr3 修改后: a = 199

7. 指针的实际应用场景

package mainimport "fmt"// 1. 避免大对象拷贝
type LargeStruct struct {Data [1000]intName string
}func processByValue(ls LargeStruct) {fmt.Printf("值传递 - 处理结构体: %s\n", ls.Name)
}func processByPointer(ls *LargeStruct) {fmt.Printf("指针传递 - 处理结构体: %s\n", ls.Name)
}// 2. 链表节点示例
type Node struct {Value intNext  *Node
}func (n *Node) Append(value int) *Node {newNode := &Node{Value: value}n.Next = newNodereturn newNode
}// 3. 错误处理模式
func divide(a, b float64) (*float64, error) {if b == 0 {return nil, fmt.Errorf("除数不能为零")}result := a / breturn &result, nil
}func main() {fmt.Println("=== 指针的实际应用 ===")// 1. 避免大对象拷贝fmt.Println("\n--- 避免大对象拷贝 ---")large := LargeStruct{Name: "Large Data"}fmt.Println("值传递:")processByValue(large)  // 会拷贝整个结构体fmt.Println("指针传递:")processByPointer(&large)  // 只传递8字节的指针// 2. 链表示例fmt.Println("\n--- 链表示例 ---")head := &Node{Value: 1}current := head.Append(2)current.Append(3)// 遍历链表for node := head; node != nil; node = node.Next {fmt.Printf("%d -> ", node.Value)}fmt.Println("nil")// 3. 错误处理fmt.Println("\n--- 错误处理 ---")if result, err := divide(10, 2); err != nil {fmt.Printf("错误: %v\n", err)} else {fmt.Printf("10 / 2 = %.1f\n", *result)}if result, err := divide(10, 0); err != nil {fmt.Printf("错误: %v\n", err)if result == nil {fmt.Println("result 是 nil 指针")}} else {fmt.Printf("10 / 0 = %.1f\n", *result)}
}

输出:

=== 指针的实际应用 ===--- 避免大对象拷贝 ---
值传递:
指针传递 - 处理结构体: Large Data--- 链表示例 ---
1 -> 2 -> 3 -> nil--- 错误处理 ---
10 / 2 = 5.0
错误: 除数不能为零
result 是 nil 指针

8. 指针陷阱和注意事项

package mainimport "fmt"func main() {fmt.Println("=== 指针陷阱和注意事项 ===")// 1. nil 指针解引用fmt.Println("\n--- nil 指针解引用 ---")var nilPtr *intfmt.Printf("nilPtr = %v\n", nilPtr)// 取消注释下面这行会引发 panic// fmt.Printf("*nilPtr = %d\n", *nilPtr)  // panic: runtime error// 安全检查if nilPtr != nil {fmt.Printf("*nilPtr = %d\n", *nilPtr)} else {fmt.Println("nilPtr 是 nil,不能解引用")}// 2. 悬空指针(Go 中较少见,但要注意生命周期)fmt.Println("\n--- 返回局部变量地址 ---")func() {local := 42ptr := &localfmt.Printf("局部变量地址: %p, 值: %d\n", ptr, *ptr)// 函数结束后,local 被销毁,但 Go 的逃逸分析会处理这种情况}()// 3. 指针比较fmt.Println("\n--- 指针比较 ---")a := 10b := 10ptrA1 := &aptrA2 := &aptrB := &bfmt.Printf("ptrA1 == ptrA2: %t\n", ptrA1 == ptrA2)  // true - 指向同一变量fmt.Printf("ptrA1 == ptrB: %t\n", ptrA1 == ptrB)    // false - 指向不同变量fmt.Printf("*ptrA1 == *ptrB: %t\n", *ptrA1 == *ptrB) // true - 值相等// 4. 指针与接口fmt.Println("\n--- 指针与接口 ---")var i interface{} = &aif ptr, ok := i.(*int); ok {fmt.Printf("成功转换为 *int: %d\n", *ptr)}
}

输出:

=== 指针陷阱和注意事项 ===--- nil 指针解引用 ---
nilPtr = <nil>
nilPtr 是 nil,不能解引用--- 返回局部变量地址 ---
局部变量地址: 0xc00001a0a8, 值: 42--- 指针比较 ---
ptrA1 == ptrA2: true
ptrA1 == ptrB: false
*ptrA1 == *ptrB: true--- 指针与接口 ---
成功转换为 *int: 10

总结

通过以上代码示例,我们可以看到:

  1. & 操作符:获取变量的内存地址
  2. * 操作符:解引用,获取指针指向的值
  3. 指针类型*T 表示指向类型 T 的指针
  4. 主要用途
    • 函数间传递引用,修改原值
    • 避免大对象拷贝,提高性能
    • 构建数据结构(链表、树等)
    • 错误处理和可选值模式

记住:Go 语言中的指针是安全的,没有指针运算,有垃圾回收机制,使用起来比 C/C++ 更安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95525.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95525.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95525.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务从0到1

微服务从0到1实施步骤与注意事项一、核心实施步骤‌‌需求分析与架构设计‌‌明确业务边界‌&#xff1a;根据业务模块&#xff08;如用户管理、订单系统&#xff09;划分服务职责&#xff0c;避免服务职责重叠或耦合‌。‌定义接口契约‌&#xff1a;通过 OpenAPI/Swagger 规范…

小程序排名优化:功能迭代如何助力排名攀升

小程序的功能不是一成不变的&#xff0c;持续的功能迭代不仅能满足用户不断变化的需求&#xff0c;也是提升排名的重要途径。平台更倾向于推荐那些不断更新、功能完善的小程序&#xff0c;因为它们能为用户提供更优质的服务。合理规划功能迭代方向和节奏&#xff0c;能让小程序…

Unity TextMeshPro(二)优化

文章目录前言一、字体打包优化二、ab打包冗余1、问题1、解决方法三、字体静态优化四、扩展总结前言 优化TextMeshPro包体大小的方法记录。 一、字体打包优化 游戏开发阶段通常使用Fast打包方式&#xff0c;在正式项目发布的时候需要切换一下打包方式&#xff0c;重新将字体打…

C++ 之 【简介 set、multiset、map、multimap 的使用】

目录 1.序列式、关联式容器 2.键值对 3.set 3.1set的简介 3.2set的常用函数 4.multiset 5.map 5.1map的简介 5.2map的常用函数 6.multimap 7.练习题 1.序列式、关联式容器 vector、deque、list、forward_list、array等是CSTL中的序列式容器 其核心特性是 元素按插入…

数据结构——排序(升级篇:快速排序、堆排序、希尔排序、计数排序)

1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a; 选择一个基准值&#xff08;pivot&#xff09;将数组分成两部分&#xff1a;小于 pivot 的放左边&#xff0c;大于 pivot 的放右边。然后递归处理 工作过程示例&#xff1a; 示例数组&#xff1a;[5, 3, 8, 4,…

C++:浅尝gdb

hp window11 wsl ubuntu what is gdb&#xff1f; GNU调试器&#xff08;英语&#xff1a;GNU Debugger&#xff0c;缩写&#xff1a;GDB&#xff09;&#xff0c;是GNU软件系统中的标准调试器&#xff0c;此外GDB也是个具有移携性的调试器&#xff0c;经过移携需求的调修与…

Android输入法一些常用的命令

Android开发过程可能会遇到Android输入法异常的问题&#xff0c;可以通过如下命令来查看和修改系统的输入法。方便调试。 获取当下系统的所有输入法 adb shell ime list获取当前的可用输入法 adb shell ime list -s获取当前的输入法 adb shell settings get secure default_inp…

Sklearn 机器学习 手写数字识别 加载并查看数据

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Sklearn 机器学习 手写数字识别:加载并查看数据 在机器学习入门案例中,手写数字识别…

卫星通信链路预算之七:上行载噪比计算

在前面的文章中我们介绍了卫星通信链路计算的基础知识&#xff0c;包括&#xff1a; 信噪比分配&#xff1b; 带宽和功带平衡原则&#xff1b; EIRP和G/T&#xff1b; 输入回退&#xff1b; 输入饱和通量密度SFD&#xff1b; 输出回退&#xff1b; 这次我们正式进入正题…

一文读懂PDB格式

最近在做分子对接和分子模拟&#xff0c;涉及到了一些盲区&#xff0c;必去pdb文件是按照列位数储存信息的&#xff0c;跟其他文件的空格或者制表符分割很不同&#xff0c;所以也可能出现一些错误&#xff0c;比如信息错位&#xff0c;因此有必要了深入解下结构相关的格式pdb、…

进阶:PGCE中级专家认证精要

PGCE中级认证的核心价值技术深度&#xff1a;掌控未来生态PostgreSQL不仅是传统关系型数据库的标杆&#xff0c;更是云原生、AI大模型训练、物联网平台等前沿场景的核心支撑。通过PGCE认证&#xff0c;你将掌握&#xff1a;万亿级数据性能调优&#xff1a;从查询优化器原理到执…

AI增强SEO关键词表现

内容概要 随着人工智能技术的不断演进&#xff0c;其在搜索引擎优化领域展现出显著潜力&#xff0c;尤其在关键词表现优化方面发挥着核心作用。本文将从基础概念入手&#xff0c;系统探讨AI如何智能提升关键词的搜索可见性、流量吸引力和转化效率&#xff0c;从而驱动整体SEO策…

PG靶机 - PayDay

一、 初步侦察与服务探测 1.1 端口扫描与服务识别 首先&#xff0c;对目标主机 192.168.163.39 进行一次全面的端口扫描&#xff0c;以识别其上运行的各项服务。 sudo nmap 192.168.163.39 -p- --min-rate5000 -A图 1: Nmap 扫描结果&#xff0c;显示开放 80、445 和 995 等端口…

MySQLl中OFFSET 的使用方法

MySQLl中OFFSET 的使用方法基本语法SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET offset_value;number_of_rows&#xff1a;指定返回的记录数量。offset_value&#xff1a;从第几条记录开始返回&#xff08;偏移量从 0 开始计数&#xff09;。示…

监管科技(RegTech)应用:技术驱动的合规革命

目录 监管科技(RegTech)应用:技术驱动的合规革命 1. 监管科技革命:数字化合规新范式 2. 技术架构全景 2.1 现代RegTech架构 2.2 合规效率公式 3. 核心技术实现 3.1 智能合约自动化合规 3.2 AI驱动的风险监测引擎 4. 核心应用场景 4.1 KYC/AML全流程自动化 4.2 实时交易监控系…

解决SQL Server连接失败:Connection refused: connect

今天创建数据库&#xff0c;本地连接SQL Server报错&#xff1a;“通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败。错误&#xff1a;Connection refused: connect”报错图如下&#xff1a;查了一圈&#xff0c;问题出在&#xff1a;TCP/IP 没启用。如果问题和我一样&…

Windows bypassUAC 提权技法详解(一)

引言 用户账户控制&#xff08;User Account Control, 简称 UAC&#xff09;是微软自 Windows Vista 起引入的一项安全功能&#xff0c;旨在通过要求用户在执行需要管理员权限的操作时进行确认&#xff0c;从而防止未经授权的系统更改。UAC 的设计初衷是提高系统安全性&#xf…

OpenCV ------图像基础处理(一)

在 OpenCV 的图像处理世界中&#xff0c;除了图像边框处理&#xff0c;还有一些基础且重要的函数和运算&#xff0c;它们在图像编辑、融合等场景中发挥着关键作用。下面我们就来详细介绍cv2.copyMakeBorder()函数的具体参数与作用&#xff0c;以及图像加法运算和加权运算的相关…

Unity宝箱随机事件实现指南

目录 前言 一、简单的使用 新增ChestInteractableEvents&#xff0c;定义宝箱交互事件 新增Box 箱子挂载脚本&#xff0c;配置事件 运行效果 二、完善各种事件 1. 完善生成金币事件 效果&#xff0c;金币飞出 2. 完善生成敌人事件敌人 效果 3. 完善生成药水事件 效…

从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统

1. 引言&#xff1a;飞算JavaAI与实时通信技术的融合 1.1 为什么需要TCP多人聊天室&#xff1f; 在即时通讯领域&#xff0c;基于TCP协议的聊天室是理解网络编程核心概念的经典案例&#xff0c;其技术价值体现在&#xff1a; 底层协议控制&#xff1a;直接操作Socket实现可靠数…