一些总结

您所在的位置:网站首页 c程序赋值表达式 一些总结

一些总结

2023-01-22 11:00| 来源: 网络整理| 查看: 265

类型转换、赋值和值比较规则大全类型转换规则大全1. 显然的类型转换规则2. 底层类型相关的类型转换规则3. 通道相关的类型转换规则4. 和接口实现相关的类型转换规则5. 类型不确定值相关的类型转换规则6. 常量相关的类型转换规则7. 非常量数值转换规则8. 字符串相关的转换规则9. 切片相关的类型转换规则10. 非类型安全指针相关的类型转换规则赋值规则值比较规则两个值是如何进行比较的?



类型转换、赋值和值比较规则大全

此篇文章将列出Go中所有的类型转换、赋值和值比较规则。

类型转换规则大全

在Go中,如果一个值v可以被显式地转换为类型T,则此转换可以使用语法形式(T)(v)来表示。 在大多数情况下,特别是T为一个类型名(即一个标识符)时,此形式可简化为T(v)。

当我们说一个值x可以被隐式转换为一个类型T,这同时也意味着x可以被显式转换为类型T。

1. 显然的类型转换规则

如果两个类型表示着同一个类型,则它们的值可以相互隐式转换为这两个类型中的任意一个。

比如,

类型byte和uint8的任何值可以转换为这两个类型中的任意一个。类型rune和int32的任何值可以转换为这两个类型中的任意一个。类型[]byte和[]uint8的任何值可以转换为这两个类型中的任意一个。

此条规则没什么可解释的,无论你是否认为此种情况中发生了转换。

2. 底层类型相关的类型转换规则

给定一个非接口值x和一个非接口类型T,并假设x的类型为Tx,

如果类型Tx和T的底层类型相同(忽略掉结构体字段标签),则x可以被显式转换为类型T。如果类型Tx和T中至少有一个是非定义类型并且它们的底层类型相同(考虑结构体字段标签),则x可以被隐式转换为类型T。如果类型Tx和T的底层类型不同,但是两者都是非定义的指针类型并且它们的基类型的底层类型相同(忽略掉结构体字段标签),则x可以(而且只能)被显式转换为类型T。

(注意:两处“忽略掉结构体字段标签”从Go 1.8开始生效。)

一个例子:

package mainfunc main() { // 类型[]int、IntSlice和MySlice共享底层类型:[]int。 type IntSlice []int type MySlice []int var s = []int{} var is = IntSlice{} var ms = MySlice{} var x struct{n int `foo`} var y struct{n int `bar`} // 这两行隐式转换编译不通过。 /* is = ms ms = is */ // 必须使用显式转换。 is = IntSlice(ms) ms = MySlice(is) x = struct{n int `foo`}(y) y = struct{n int `bar`}(x) // 这些隐式转换是没问题的。 s = is is = s s = ms ms = s}

指针相关的转换例子:

package mainfunc main() { type MyInt int type IntPtr *int type MyIntPtr *MyInt var pi = new(int) // pi的类型为*int var ip IntPtr = pi // 没问题,因为底层类型相同 // 并且pi的类型为非定义类型。 // var _ *MyInt = pi // 不能隐式转换 var _ = (*MyInt)(pi) // 显式转换是没问题的 // 类型*int的值不能被直接转换为类型MyIntPtr, // 但是可以间接地转换过去。 /* var _ MyIntPtr = pi // 不能隐式转换 var _ = MyIntPtr(pi) // 也不能显式转换 */ var _ MyIntPtr = (*MyInt)(pi) // 间接隐式转换没问题 var _ = MyIntPtr((*MyInt)(pi)) // 间接显式转换没问题 // 类型IntPtr的值不能被直接转换为类型MyIntPtr, // 但是可以间接地转换过去。 /* var _ MyIntPtr = ip // 不能隐式转换 var _ = MyIntPtr(ip) // 也不能显式转换 */ // 间接隐式或者显式转换都是没问题的。 var _ MyIntPtr = (*MyInt)((*int)(ip)) // ok var _ = MyIntPtr((*MyInt)((*int)(ip))) // ok}3. 通道相关的类型转换规则

给定一个通道值x,假设它的类型Tx是一个双向通道类型,T也是一个通道类型(无论是双向的还是单向的)。如果Tx和T的元素类型相同并且它们中至少有一个为非定义类型,则x可以被隐式转换为类型T。

一个例子:

package mainfunc main() { type C chan string type C1 chan


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3