官术网_书友最值得收藏!

  • Go Systems Programming
  • Mihalis Tsoukalos
  • 321字
  • 2021-07-02 18:08:03

Unsafe code

Unsafe code is Go code that bypasses the type safety and memory security of Go and requires the use of the unsafe package. You will most likely never need to use unsafe code in your Go programs but if for some strange reason you ever need to, it will probably have to do with pointers.

Using unsafe code can be dangerous for your programs, so only use it when it is absolutely necessary. If you are not completely sure that you need it, then do not use it.

The example code in this subsection is saved as unsafe.go and will be presented in two parts.

The first part is as follows:

package main 
 
import ( 
   "fmt" 
   "unsafe" 
) 
 
func main() { 
   var value int64 = 5

var p1 = &value var p2 = (*int32)(unsafe.Pointer(p1))

You first create a new int64 variable that is named value. Then, you create a pointer to it named p1. Next, you create another pointer that points to p1. However, the p2 pointer that points to p1 is a pointer to an int32 integer, despite the fact that p1 points to an int64 variable. Although this is not permitted by Go rules, the unsafe.Pointer() function makes this possible.

The second part is as follows:

   fmt.Println("*p1: ", *p1) 
   fmt.Println("*p2: ", *p2) 
   *p1 = 312121321321213212 
   fmt.Println(value) 
   fmt.Println("*p2: ", *p2) 
   *p1 = 31212132 
   fmt.Println(value) 
   fmt.Println("*p2: ", *p2) 
} 

Executing unsafe.go will create the following output:

$ go run unsafe.go
*p1:  5
*p2:  5
312121321321213212
*p2:  606940444
31212132
*p2:  31212132

The output shows how dangerous an unsafe pointer can be. When the value of the value variable fits into an int32 memory space (5 and 31212132), then p2 works fine and shows the correct result. However, when the value variable holds a value (312121321321213212) that does not fit into an int32 memory space, then p2 shows an erroneous result (606940444), without giving you a warning or an error message.

主站蜘蛛池模板: 万载县| 墨玉县| 金堂县| 扎鲁特旗| 莱州市| 东安县| 公主岭市| 陵水| 巫溪县| 六盘水市| 台州市| 正宁县| 安国市| 鄂伦春自治旗| 赣榆县| 双牌县| 泗洪县| 屯留县| 会同县| 镇康县| 哈尔滨市| 民勤县| 海城市| 蕉岭县| 清原| 宜丰县| 即墨市| 纳雍县| 马关县| 昆明市| 当雄县| 黎平县| 赫章县| 黄大仙区| 富阳市| 克什克腾旗| 汉源县| 思南县| 星子县| 桐城市| 甘德县|