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

Go中别名类型之间的转换是否会创建副本?

时经纬
2023-03-14
问题内容

例:

type MyString string 
var s = "very long string"
var ms = MyString(s)
var s2 = string(s)

mss2的完整副本s(将通过来完成[]byte(s))?还是它们只是一个字符串结构副本(将真实值保留在指针中)?

如果我们将其传递给函数怎么办?例如:

func foo(s MyString){
  ...
}
foo(ms(s))  // do we copy s here?

问题答案:

规格:转化次数:

特定规则适用于数字类型之间或字符串类型之间的(非恒定)转换。这些转换可能会更改的表示形式x并产生运行时成本。
所有其他转换只会更改类型,而不会更改的表示形式x

因此,如果要在自定义类型的基础类型之间来回转换,则不会进行复制。

当您将值传递给函数或方法时,将创建并传递一个副本。如果将a传递string给函数,则string由于strings是不可变的,因此只会复制和传递描述的结构。

如果您传递一个切片(切片也是描述符),也是如此。传递切片将复制切片描述符,但它将引用相同的基础数组。



 类似资料:
  • type 语句可以给一个已存在类型起一个新的名字。类型必须要有 CamelCase(驼峰方式)的名称,否则 编译器会产生一个警告。对规则为例外的是基本类型: usize,f32等等。 // `NanoSecond` 是 `u64` 的新名字。 type NanoSecond = u64; type Inch = u64; // 使用一个属性来忽略警告。 #[allow(non_camel_case

  • 本文向大家介绍类型转换(Type casting)和类型转换(Type conversion)之间的区别,包括了类型转换(Type casting)和类型转换(Type conversion)之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解类型转换和类型转换之间的区别。 类型转换(Type casting) 开发人员使用强制转换运算符将数据类型转换为另一种数据类型。 它可以

  • 问题内容: 看到 这个操场片段 。 相关代码: 通过显式声明类型,第一个类型转换起作用。但是,第二次引发恐慌。为什么?是否有一种干净的方法可以转换为更长的功能签名? 问题答案: tl; dr 对于类型断言(您使用的类型),仅实际类型很重要。因此,仅等于和不等于。 说明 首先,这与铸造无关。进行中没有强制转换。有类型断言和类型转换。 您正在处理类型断言,并假设与类型 转换 具有相同的条件。在阅读您的

  • 主要内容:类型断言的格式,将接口转换为其他接口,将接口转换为其他类型Go语言中使用接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。 类型断言的格式 类型断言是一个使用在接口值上的操作。语法上它看起来像 i.(T) 被称为断言类型,这里 i 表示一个接口的类型和 T 表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。 类型断言的基本格式如下: 其中,i

  • 问题内容: C ++或Java中的类型转换和类型转换之间有什么区别? 问题答案: 类型 转换 将变量引用的值(内存块)视为与声明该变量的类型不同的类型。 类型 转换 实际上是在对该值进行转换。 在许多语言中, 某些 强制转换(通常是数字强制转换)的确会导致转换(这会因语言而异),但大多数情况下只是“将X当作Y处理”。 像人类语言的大多数方面一样,不幸的是,这些术语在不同社区中的使用略有不同,主要是

  • 我正在阅读有关C++11新特性的维基百科页面,但不理解有关类型别名的这一部分:https://en.wikipedia.org/wiki/c%2b%2b11#template_aliases using语法也可以用作C++11中的类型别名: typedef void(*FunctionType)(double);//旧样式 使用FunctionType=void(*)(double);//新引入的