热门标签 | 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,
}





推荐阅读
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本文详细介绍了如何使用 PHP 接收并处理微信支付的回调结果,确保支付通知能够被正确接收和响应。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
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社区 版权所有