go语言中的type后面跟着的是名字还是类型?

1,

type Vertex struct {
    Lat, Long float64
}

func main() {
    b := Vertex{1, 2}
    fmt.Printf("%T\n", b)

我本来以为Vertex是名字,struct是类型。不过根据%T
打印出来的是main.Vertex。

2,想把byte转化为string,然后也是提示类型不符

type strType [4]byte
str := string(strType[:4])

cannot convert strType (type strType) to type string

根据这两个例子,看起来type后面跟着的就是类型了。望解答

共 6 个回复


xinyu391

Vertex 也是类型,
是你自定义的类型
strType 也是新类型,自然string() 不认了

# 0

HOOHyou

@xinyu391
谢谢你的回复。

type Vertex struct
我之前认为的是Vertex是参数的名字,struct是类型。那比如说strType和Type之间有什么区别?不太理解。

能稍微讲讲这方面的东西吗?或者哪里有比较详细的资料。我在https://tour.go-zh.org/basics/10 上看的,讲的比较简洁,有些看不懂

# 1

leronpror

不用臆测了,type xxx struct这样的东西在编译的时候会进行语法解析,按照格式来的.
type strType [4]byte
str := string(strType[:4])
strType[:4]这个语法就不成立,[]是运算符,是取一个数组或者切片的内容,而strType只是一个[4]byte的别称,编译的时候会告诉你strType[:4]不是一个表达式.
至于string()这个强转表达式的参数必须是一个切片,数组不行

最后,type后面当然是一个类型名称

# 2

HOOHyou

@leronpror
谢谢你的解答。

不好意思纠结于这个小地方。如果type后面跟着的是类型,那岂不是strType和struct都是类型啦?而且根据fmt.Printf("%T\n",...)这个打印出来的是main.strType。如果strType是类型的话,那struct对于这个参数来说又是什么呢?

不太理解这种语法。望解答,谢谢

# 3

leronpror

strType是结构体的别名,struct{}是真正意义上的类型,所以strType就相当于给后面的struct{}起了个名字

# 4

HOOHyou

@leronpror
谢谢,我就是这么理解的。所以我觉得fmt.Printf("%T\n",...)这句代码应该打印出来的是struct而不是strType吧。

# 5