热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我如何在Go中做一个文字*int64?

我如何在Go中做一

Go 语言规范(地址运算符)不允许获取数字常量的地址(不是类型常量也不是类型常量)。

操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x[在&x]的表达式中也可以是(可能带括号的)复合文字。

您的选择(在Go Playground上尝试所有选项):

1) 与 new()

您可以简单地使用内置new()函数来分配一个新的零值int64并获取其地址:

instance := SomeType{
SomeField: new(int64),
}

但请注意,这只能用于分配和获取指向任何类型的零值的指针。

2) 带辅助变量

对于非零元素,最简单和推荐的是使用一个可以获取地址的辅助变量:

helper := int64(2)
instance2 := SomeType{
SomeField: &helper,
}

3) 具有辅助功能

在我的github.com/icza/gox库中,gox包中提供了用于获取指向非零值的指针的辅助函数,因此您不必将它们添加到您需要的所有项目中。

或者,如果您多次需要此功能,您可以创建一个辅助函数来分配并返回一个*int64

func create(x int64) *int64 {
return &x
}

并使用它:

instance3 := SomeType{
SomeField: create(3),
}

请注意,我们实际上没有分配任何东西,Go 编译器在我们返回函数参数的地址时这样做了。Go 编译器执行转义分析,并在堆(而不是堆栈)上分配局部变量(如果它们可能对函数进行转义)。有关详细信息,

4) 带单行匿名函数

instance4 := SomeType{
SomeField: func() *int64 { i := int64(4); return &i }(),
}

或者作为(较短的)替代方案:

instance4 := SomeType{
SomeField: func(i int64) *int64 { return &i }(4),
}

5) 带切片字面量、索引和取地址

如果你想*SomeField成为其他人0,那么你需要一些可寻址的东西。

你仍然可以这样做,但这很丑陋:

instance5 := SomeType{
SomeField: &[]int64{5}[0],
}
fmt.Println(*instance2.SomeField) // Prints 5

这里发生的是一个[]int64切片是用文字创建的,有一个元素 ( 5)。并且它被索引(第0个元素)并取第0个元素的地址。在后台,一个 的数组[1]int64也将被分配并用作切片的后备数组。所以这里有很多样板。

6) 使用辅助结构文字

让我们检查可寻址性要求的例外情况:

作为可寻址性要求的一个例外,x[在&x]的表达式中也可以是(可能带括号的)复合文字。

这意味着采用复合文字的地址,例如结构文字是可以的。如果我们这样做,我们将分配结构值并获得指向它的指针。但如果是这样,我们就可以使用另一个要求:。因此,如果结构体字面量包含一个 type 字段int64,我们也可以获取该字段的地址!

让我们看看这个选项的实际效果。我们将使用这个包装结构类型:

type intwrapper struct {
x int64
}

现在我们可以这样做:

instance6 := SomeType{
SomeField: &(&intwrapper{6}).x,
}

请注意,这

&(&intwrapper{6}).x

意思如下:

& ( (&intwrapper{6}).x )

但是我们可以省略“外”括号,因为地址运算符&应用于选择器表达式的结果。

另请注意,在后台会发生以下情况(这也是有效的语法):

&(*(&intwrapper{6})).x

7) 使用辅助匿名结构文字

原理与案例#6 相同,但我们也可以使用匿名结构体字面量,因此不需要帮助器/包装器结构类型定义:

instance7 := SomeType{
SomeField: &(&struct{ x int64 }{7}).x,
}





推荐阅读
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 本课程深入探讨了 Python 中自定义序列类的实现方法,涵盖从基础概念到高级技巧的全面解析。通过实例演示,学员将掌握如何创建支持切片操作的自定义序列对象,并了解 `bisect` 模块在序列处理中的应用。适合希望提升 Python 编程技能的中高级开发者。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 链栈虽然通常以数组作为底层实现,但也可以采用链表来构建Stack类。在这种情况下,空堆栈通过NULL指针表示。当新元素被压入堆栈时,它会被添加到链表的头部,从而实现高效的入栈操作。此外,出栈操作则通过移除链表头部的节点来完成,确保了操作的时间复杂度为O(1)。这种设计不仅简化了内存管理,还提高了动态数据处理的灵活性。 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 无论是计算机专业学生还是非计算机专业的学习者,在掌握C语言的过程中可能会遇到诸多挑战,不清楚从何入手。为此,本文系统地梳理了2019年福建省C语言的核心知识点,并结合最新的技术进展进行了详细总结,旨在为初学者提供全面的学习指导。文章不仅涵盖了基础语法和数据结构,还深入探讨了指针、内存管理和算法优化等高级主题,帮助读者快速提升编程能力。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
author-avatar
god
快出去找工作了,加油!!!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有