iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Go 中的切片类型转换
  • 174
分享到

Go 中的切片类型转换

go语言 2024-02-10 15:02:05 174人浏览 薄情痞子
摘要

PHP小编苹果为大家介绍Go语言中的切片类型转换。在Go语言中,切片是一种动态数组,常用于存储和操作一组相同类型的元素。切片类型转换是指将一个类型的切片转换为另一个类型的切片,这在实际

PHP小编苹果为大家介绍Go语言中的切片类型转换。在Go语言中,切片是一种动态数组,常用于存储和操作一组相同类型的元素。切片类型转换是指将一个类型的切片转换为另一个类型的切片,这在实际开发中非常常见。本文将详细介绍切片类型转换的注意事项和实际应用,帮助读者更好地理解和运用这一特性。

问题内容

我对 go 很陌生,有 c++ 背景,并且偶然发现了一些奇怪的问题。 代码如下:

package main

import (
"fmt"
"unsafe"
)

func main() {
     arr := []string { "one", "two", "three" }
     address := unsafe.pointer(&arr)
     addptr := (*[]string)(unsafe.pointer(*(*uintptr)(address)))
     fmt.println((*addptr)[0])
}

此代码失败并显示:


runtime error: growslice: len out of range

例如,如果我将演员表更改为:

addptr := (*[0]string)(unsafe.pointer(*(*uintptr)(address)))

上面的代码工作得很好。

我知道这是对数组指针的强制转换,并且数组必须具有恒定的大小, 但如何将其转换为指向切片的指针呢?

更令人困惑的是,可以获取切片地址并将其分配给指针,如下所示:

func main() {
     arr := []string { "one", "two", "three" }
     var arrPtr *[]string = &arr
     fmt.Println((*arrPtr)[0])
}

这次一切都会正常,尽管指针的类型与我在第一个示例中将不安全指针转换为相同的类型。 有人可以帮助理解这里到底发生了什么吗?

解决方法

一些背景:切片标头包含指向后备数组、长度和容量的指针。

问题第一部分中的代码将切片头转换为指向切片头的指针。 go vet 命令警告问题中的代码可能滥用 unsafe.pointer。

通过删除额外的取消引用操作来修复,以便代码从指向切片头的指针转换为指向切片头的指针。

arr := []string{"one", "two", "three"}
address := unsafe.pointer(&arr)
addptr := (*[]string)(unsafe.pointer((*uintptr)(address)))
fmt.println((*addptr)[0]) // prints one

不需要转换为 *uintptr。简化为:

arr := []string{"one", "two", "three"}
address := unsafe.pointer(&arr)
addptr := (*[]string)(unsafe.pointer(address))
fmt.println((*addptr)[0]) // prints one

不需要不安全的恶作剧。简化为:

arr := []string{"one", "two", "three"}
addptr := &arr
fmt.println((*addptr)[0]) // prints one

使用以下代码将切片的后备数组指针转换为数组指针。该代码很脆弱,因为它假设切片头的第一个字是指向后备数组的指针。

arr := []string{"one", "two", "three"}
address := unsafe.pointer(&arr)
addptr := (*[1]string)(unsafe.pointer(*(*uintptr)(address)))
fmt.println((*addptr)[0]) // prints one

不需要前面代码片段中的 uintptr 转换。简化为:

arr := []string{"one", "two", "three"}
address := unsafe.Pointer(&arr)
addPtr := (*[]string)(address)
fmt.Println((*addPtr)[0]) // prints one

我希望这会有所帮助。

以上就是Go 中的切片类型转换的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Go 中的切片类型转换

本文链接: https://www.lsjlt.com/news/563127.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 中的切片类型转换
    php小编苹果为大家介绍Go语言中的切片类型转换。在Go语言中,切片是一种动态数组,常用于存储和操作一组相同类型的元素。切片类型转换是指将一个类型的切片转换为另一个类型的切片,这在实际...
    99+
    2024-02-10
    go语言
  • Go 中将 int 切片转换为自定义 int 切片指针类型的函数
    php小编新一今天为大家介绍的是在Go语言中将int切片转换为自定义int切片指针类型的函数。在Go语言中,切片(slice)是一个非常常用的数据类型,可以动态地增加或减少元素个数。有...
    99+
    2024-02-08
    go语言
  • Go interface{} 转切片类型的实现方法
    遇到这样一个情况想将变量v转化为[]string类型 var v interface{} a := []interface{}{"1", "2"} v = a // v 这时还是in...
    99+
    2024-04-02
  • golang 图片类型转换
    Go是一门被广泛应用于网络编程、云计算、分布式系统等领域的编程语言,其在图像处理方面的应用也逐渐受到了关注。在Go语言中,图片类型转换是一项常见的图像处理操作,可以将一种格式的图片转换为另一种格式,比如将JPEG格式的图片转换为PNG格式的...
    99+
    2023-05-15
  • 不同语言中类型转换与Go语言类型转换的差异
    go 语言类型转换与其他语言存在差异:go 语言强制类型安全,其他语言允许隐式转换;go 语言内置转换不导致数据丢失,而其他语言的强制转换可能导致;go 语言使用 t(v) 语法进行显式...
    99+
    2024-04-12
    go 类型转换 python go语言 c++ 数据丢失 隐式转换
  • Go - 将指向结构切片的指针转换为接口切片
    php小编百草在Go编程语言中,有时候我们需要将指向结构切片的指针转换为接口切片。这种转换在一些特定的情况下非常有用,例如当我们需要对一个切片中的元素进行修改时。通过将指针转换为接口切...
    99+
    2024-02-09
  • 详解Go语言中的数据类型及类型转换
    目录1、基本数据类型2、基础数据类型转换3、基本数据类型转为字符串4、strconv的使用5、字符串转为基础类型1、基本数据类型 数据类型有很多,先研究一下基础的,例如:布尔型、数字...
    99+
    2024-04-02
  • 切片与Go中的切片
    问题内容 在go中的unsafe.SliceData函数的文档中,它说: SliceData returns a pointer to the underlying array of...
    99+
    2024-02-06
  • python中切片类型是什么
    这篇文章主要介绍python中切片类型是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、list切片如果第一个索引是0,还可以省略。>>> L[:3]['Michael...
    99+
    2023-06-15
  • 尽管类型相同,Go 类型转换仍失败
    尽管类型相同,Go 类型转换仍可能失败。类型转换是在不同数据类型之间进行转换的过程,但在Go语言中,即使两个类型看起来相同,也不能保证转换一定成功。这是因为Go语言对类型的严格检查,要...
    99+
    2024-02-13
    go语言 标准库
  • golang修改切片类型
    Golang是一种强类型语言,对于变量的类型要求非常严格。当我们需要修改切片类型时,往往需要进行相应的类型转换。本文将介绍如何在Golang中修改切片类型。什么是切片?在Golang中,切片是一种比数组更为灵活、方便的数据结构。切片可以看作...
    99+
    2023-05-14
  • Python中bool类型转换
    在python中,以下数值会被认为是False: 为0的数字,包括0,0.0 空字符串,包括”,”“ 表示空值的None 空集合,包括(),[],{} 其他的值都认为是True。 None是python中的一个特殊值,表示什么...
    99+
    2023-01-31
    类型 Python bool
  • 从切片创建类型
    问题内容 我想创建一个像堆栈一样的数据类型。我想在“顶部”添加和删除条目,并能够将其打印出来。在此示例中,xpath 类型用于遍历 xml 文档并跟踪当前路径。 所以我创建了一个xpa...
    99+
    2024-02-06
    编译错误 string类 overflow
  • go语言的数据类型转换教程
    Go语言中,数据类型转换通常使用强制类型转换”类型断言“进行,常见的数据类型转换方法如下:1、将一个整型数值转换为另一个整型数值时,可以使用强制类型转换;2、浮点型数值转换为另一个浮点型数值时,也可以使用强制类型转换;3、字符串转换为另一个...
    99+
    2023-12-18
    go语言数据类型转换 go语言 Golang
  • Go语言中的数据类型有哪些及类型间怎么转换
    这篇“Go语言中的数据类型有哪些及类型间怎么转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中的数据类型有哪些及类...
    99+
    2023-06-30
  • java的类型转换
    有关int与string的互转[@more@]如何将字串 String 转换成整数 int A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([...
    99+
    2023-06-03
  • 一文带你了解Go语言中的类型断言和类型转换
    目录类型断言类型判断为什么需要断言类型转换什么时候使用类型转换类型为什么称为转换类型结论在Go中,类型断言和类型转换是一个令人困惑的事情,他们似乎都在做同样的事情。 下面是一个类型断...
    99+
    2024-04-02
  • es6怎么切割字符串并转换类型
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。在es6中,可以利用split()函数来切割字符串,将其转换为数组类型。split()函数介绍split()方法用于将给定字符串拆分为字符串数组;该方法是...
    99+
    2023-05-14
    javascript es6字符串 ES6
  • go语言如何求任意类型切片的长度
    这篇文章将为大家详细讲解有关go语言如何求任意类型切片的长度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。go适合做什么go是golang的简称,而golang可以做服务器端开发,且golang很适合做日...
    99+
    2023-06-14
  • Python中的数据类型转换
    基本类型转换 python3与python2通用函数: int('123456',10) # 转换为指定进制的整数 hex(123456) # 整数转换为16进制串,转换后类型为字符串 bin(123) # 整数转换为...
    99+
    2023-01-31
    数据类型 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作