当前位置: 首页 > 面试题库 >

字符串中的指针golang

仲孙经赋
2023-03-14
问题内容

我的应用程序接受来自的指针os.Args

例如

pointer := os.Args[1] //"0x7ffc47e43200"

如何使用该指针并获取存储在该位置的值?


问题答案:

免责声明:您可能已经知道,这很危险,如果要在生产应用程序中执行此操作,则最好有一个很好的理由。话虽如此…

您需要做一些事情。这是代码,然后我们将逐步进行介绍。

package main

import (
    "fmt"
    "os"
    "strconv"
    "unsafe"
)

func main() {
    str := "7ffc47e43200" // strconv.ParseUint doesn't like a "0x" prefix
    u, err := strconv.ParseUint(str, 16, 64)
    if err != nil {
        fmt.Fprintln(os.Stderr, "could not parse pointer:", err)
        os.Exit(1)
    }

    ptr := unsafe.Pointer(uintptr(u)) // generic pointer (like void* in C)
    intptr := (*int)(ptr)             // typed pointer to int
    fmt.Println(*intptr)
}

您可以在Go Playground上运行它。

首先,我们需要将字符串解析为数值。在您的示例中,您给出了一个十六进制数,因此我们将以16为底进行解析(这是的“
16”参数strconv.ParseUint)。请注意,strconv.ParseUint它不喜欢“ 0x”前缀,因此我将其删除。

然后,我们需要将数字转换为指针类型。为此,我们将使用unsafe.PointerGo编译器特有的类型。通常,编译器不允许您在指针类型之间进行转换。根据unsafe.Pointer文档,例外是:

  • 任何类型的指针值都可以转换为Pointer。
  • 指针可以转换为任何类型的指针值。
  • 可以将uintptr转换为Pointer。
  • 指针可以转换为uintptr。

因此,为了转换为指针,我们需要先转换为a uintptr,然后转换为an
unsafe.Pointer。从这里,我们可以转换为所需的任何指针类型。在此示例中,我们将转换为一个int指针,但是我们也可以选择任何其他指针类型。然后,我们取消引用指针(在这种情况下会出现紧急情况)。



 类似资料:
  • 主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww

  • 我得到一个空指针异常在我的code.Please帮我解决它。这是我的代码。 这是我的原木猫。 第138行为点击法-

  • 问题内容: 如何将类型中的字符串指针的引用值设置为空字符串?考虑以下示例: 我尝试了和运算符的所有组合都无济于事: 显然其中一些很愚蠢,但我没有发现尝试的危害。我也尝试使用和: 这会导致编译错误 恐慌:反映:使用不可寻址的值reflect.Value.SetString 我假设这是因为Go中的字符串是不可变的? 问题答案: 字符串文字不可寻址。 取包含空字符串的变量的地址: 或使用新的:

  • 教学目标 能够使用指针 能用指针按引用调用向函数传递参数 了解指针、数组与字符串之间的密切关系 了解指针在函数中的使用 能够声明和使用字符串数组

  • 问题内容: 我想将字符串切片转换为指向字符串的指针切片 %!p(string = a)=>字符串 %!p(string = b)=>字符串 %!p(string = c)=>字符串 [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0] 据我了解, 我的变量似乎是一个字符串,而不是指向字符串的指针。 因此应从迭代时复制。 显然我不正确,因为地址仍然相同。如果值不是指针,该

  • 问题内容: 在Go 规范中写道: 字符串是不可变的:一旦创建,就无法更改字符串的内容。 我有以下代码: 我原本希望地址在之后更改。就像Java那样,我们在其中重新分配String引用。 什么是“不变性”? 问题答案: 值 是不可变的。 不是一个值。这是一个 变量 (类型)。并且变量的值可能会更改,这就是您对任何编程语言所期望的。 是一个值,这是不可变的。是另一个值,当您分配给时,您只需为变量分配另