二行不能理解的代码

zjfy286 · 2018-08-02 18:07:29 · 3768 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-08-02 18:07:29 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "fmt"
    "unsafe"
)

type stringssHeader struct {
    Data unsafe.Pointer
    Len  int
    Byt  byte
}

func main() {

    var bytes = []byte{0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 'h', 'c'}
    var ptr = &bytes[0]
    header := (*stringssHeader)(unsafe.Pointer(ptr))
    header.Data = unsafe.Pointer(&bytes[17])

    fmt.Println(*(*string)(unsafe.Pointer(ptr)))
}
header := (*stringssHeader)(unsafe.Pointer(ptr))
header.Data = unsafe.Pointer(&bytes[17])

这2行的意义是什么,求解惑


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3768 次点击  
加入收藏 微博
4 回复  |  直到 2018-09-06 09:56:41
zjfy286
zjfy286 · #1 · 6年之前

fmt.Println((string)(unsafe.Pointer(ptr)))
这行用的是ptr 不解

freboat
freboat · #2 · 6年之前

你如果会C的话就很容易理解: char buf[xxx] =....; //开个大空间

header = (stringHeader *)&buf[0] ; //把刚才的空间看成一个结构

结构体内的data指针是一样的原理, 只不过指向自己内部的一个空间 , 不过这里的‘h' 'c'前面的1怎么回事

satbirdd
satbirdd · #3 · 6年之前

打印出ptr就是为了展示,当header结构体中的第一个属性的地址改变的时候,并不修改改变量原来的地址所引用的值的意思吧。如果不是这样,ptr打印出来就是'h'了。

meission
meission · #4 · 6年之前

var ptr = &bytes[0] 取出bytes 首地址。

header := (*stringssHeader)(unsafe.Pointer(ptr)) 将地址强行转换成为stringssHeader类型的指针。 []byte{0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 'h', 'c'}

第一个0 :Data unsafe.Pointer,这个时候是空指针。 第二个"0, 0, 0, 0, 0, 0, 0, 2" 这个八位是 Len , 第三 “0, 0, 0, 0, 0, 0, 0, 1” 是 Byt 。

header.Data = unsafe.Pointer(&bytes[17]) 赋值之后 Data 就不是空指针了。

(string)(unsafe.Pointer(ptr)) 和 (stringssHeader)(unsafe.Pointer(ptr)) 是一样的 写法。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传