Golang指針操作

在 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實現可靠數…