Golang Go语言中的底层类型问题

发布于 1周前 作者 wuwangju 来自 Go语言
package main

import “fmt”

type I int type M map[string]interface{} type M2 map[string]interface{}

func main() { var m M = M{“hello”: “world”} printM(m) //可以

var num I = 123
printI(num) //不行的


printM2(m) //不行的

}

func printI(i int) { fmt.Println(i) }

func printM(m map[string]interface{}) { fmt.Println(m) }

func printM2(m M2) { fmt.Println(m) }

众所周知, Iint 是两个类型,但是为啥 M 能直接被当做 map[string]interface{} ?

proxy


Golang Go语言中的底层类型问题

更多关于Golang Go语言中的底层类型问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

golang 类型不能隐式转换

更多关于Golang Go语言中的底层类型问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果用了 vscode-go 插件,或者其他的 IDE,在写代码时就有提示类型不正确吧。

可以使用类型断言,或者是使用别名。 别名的方式是 type I = int, 支持 1.9 以上版本,但有些其它的限制。

I, M, M2,int, map[string]interface{} 确实是五种不同的类型,所以 printI(num), printM2(m) 不能执行是对的,也能够理解。但是 printM(m)为什么可以,说实话,我回答不上来,逻辑上讲不通。只能归结为 golang 中的 map 是一种引用类型,有我们不知道的其他原因。假如楼主尝试一下 go 中的其他引用类型对比 map, 比如
type C chan int
func printC(c chan int){}
也能得到类似 map 的结果, 而我尝试了其他的值类型(包括定义一个 struct), 得到的结果是与 int 这种结果一致的。额外说一下,golang 中只有 map, slice, channel 三种引用累心,其余都是值类型。

引用类型还包括反射,函数,接口

接口不应该叫引用类型,应该叫指针类型

有答案了
https://golang.org/ref/spec#Assignability
x’s type V and T have identical underlying types and at least one of V or T is not a defined type.
all numeric types are defined types

谢谢, 明白了. 总结一下: 根据文档描述 The new type is called a defined type. It is different from any other type, including the type it is created from. 那么所有通过 type 定义的结构体 /类型也都是 defined type(当然不全包括 type T1 = T 这种形式定义的部分新类型). 文档上还说 Boolean type, numberic type, string type 都是 defined type.

那么问题来了,有哪些不是 defined type: map, channel, slice, pointer, 函数类型 …(欢迎继续补充, 其实这些类型看上去还是挺有规律的)

在Golang(Go语言)中,底层类型是一个深入理解语言特性和优化性能的关键概念。Go语言的类型系统相对简单直观,但底层类型的理解有助于开发者编写更高效、更可靠的代码。

Go语言的底层类型主要涉及两个方面:内存布局和数据表示。每种类型在底层都有其特定的内存占用方式和数据排列方式。例如,基本类型如intfloat64等,在底层对应着特定的内存大小和表示方法。

在Go中,类型别名和底层类型是两个容易混淆的概念。类型别名是通过type关键字为已有类型定义的新名称,但底层类型仍然保持不变。这意味着类型别名和原类型在底层是等价的,可以互换使用。然而,这并不意味着所有看似相同的类型在底层都是等价的。例如,通过结构体定义的新类型和通过组合得到的类型,即使它们包含相同的字段,底层类型也是不同的。

此外,Go语言的接口(interface)也涉及到底层类型的概念。一个接口值在底层由一个类型信息和一个指向具体值的指针组成。这允许Go语言实现接口的动态类型和动态派发。

总的来说,理解Go语言中的底层类型有助于开发者更好地掌握语言的内存管理和性能优化。同时,也需要注意类型别名和接口等特性对底层类型的影响,以避免潜在的错误和性能问题。在实际开发中,结合具体需求和性能考虑,合理利用底层类型知识,可以编写出更加高效、可靠的Go语言程序。

回到顶部