偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一文搞懂Golang中的指針

開發(fā) 前端
本文介紹了普通指針類型、Uintptr類型和Unsafe.Pointer類以及它們之間的關系,官方不推薦使用Unsafe 包,因為它會忽略類型安全檢查,可能會導致內存問題。

Golang中和指針相關的類型有三種:普通指針類型(取地址"&"、指針間接引用"*"), uintptr類型, unsafe.Pointer類型。

普通指針

普通指針類型(取地址"&"、指針間接引用"*"),用于傳遞對象地址,不能進行指針運算。Golang會在編譯時檢查指針的類型安全性,幫助用戶避免潛在的指針問題。

package main

import "fmt"

type User struct {
	Name string
}

func main() {
	var u User
	u.Name = "xiaoming"
	p := &u
	fmt.Println(p)
	fmt.Println(*p)
}

uintptr類型

uintptr是一種無符號整型類型,可以保存一個指針值,也可以進行指針運算,但是它并不是一個指針類型,所以不能直接用來取值。想要取值的話,需要通過unsafe.Pointer轉換到具體類型指針后,使用"*"號取值。

uintptr在builtin包里的源代碼如下:

// uintptr is an integer type that is large enough to hold the bit pattern of
// any pointer.
type uintptr uintptr

官方的注釋是:uintptr是一個能足夠容納指針位數(shù)大小的整型類型。

使用示例:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var num int = 10
	ptr := &num
	addr := uintptr(unsafe.Pointer(ptr))

	fmt.Printf("Value: %v, Address: %v\n", *ptr, addr)

	newAddr := addr + 4
	newPtr := (*int)(unsafe.Pointer(newAddr))

	fmt.Printf("Value: %v, Address: %v\n", *newPtr, newAddr)
}

unsafe.Pointer類型

unsafe.Pointer是unsafe包中的一個類型,用于處理指針的底層操作??梢詫⑷魏晤愋偷闹羔樲D換為unsafe.Pointer類型,也可以將unsafe.Pointer類型轉換為任何類型的指針。使用unsafe.Pointer要特別小心,因為它會忽略類型安全檢查,可能會導致內存問題。

unsafe.Pointer可以作為橋梁,將使用"&"取的地址轉換成uintptr進行指針運算,也可以再轉換為具體類型的指針通過”*“取值。

unsafe.Pointer的四種操作規(guī)則如下:

  • 任何類型的指針都可以轉化成unsafe.Pointer。
  • unsafe.Pointer可以轉化成任何類型的指針。
  • uintptr可以轉換為unsafe.Pointer。
  • unsafeP.ointer可以轉換為uintptr。
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	i := 30
	ptr1 := &i

	var ptr2 *int64 = (*int64)(unsafe.Pointer(ptr1))
	*ptr2 = 8

	fmt.Println(i)
}

上面的代碼通過unsafe.Pointer把*int類型的ptr1轉換為了*int64類型的ptr2,然后對*int64進行操作,改變了i的值。

小結

本文介紹了普通指針類型、uintptr類型和unsafe.Pointer類以及它們之間的關系,官方不推薦使用unsafe 包,因為它會忽略類型安全檢查,可能會導致內存問題。

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-04-12 12:19:08

語言模型AI

2022-03-24 08:51:48

Redis互聯(lián)網NoSQL

2023-09-08 08:20:46

ThreadLoca多線程工具

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應用程序接口

2021-12-29 17:38:17

JavaScripttypeof前端

2023-05-31 13:32:08

Javalambda函數(shù)

2021-09-11 10:41:27

PythonPickle模塊

2024-02-01 11:57:31

this指針代碼C++

2022-05-05 16:47:24

Docker網絡空間容器

2022-08-15 15:39:23

JavaScript面向對象數(shù)據

2021-01-13 05:21:59

參數(shù)

2023-08-24 16:50:45

2021-06-30 08:45:02

內存管理面試

2019-11-19 08:00:00

神經網絡AI人工智能

2020-03-18 14:00:47

MySQL分區(qū)數(shù)據庫

2023-04-03 15:04:00

RPCPHP語言

2023-10-16 08:16:31

Bean接口類型

2022-06-07 10:13:22

前端沙箱對象

2024-06-05 11:43:10

點贊
收藏

51CTO技術棧公眾號