Golang 中国

在 Julia, Haskell 中:
type Estr String
只是定义一个类型的别名,就好像 C 的宏一样,但是 go 语言的 type 定义了一个新的类型,总是在一些地方提示要明确的类型转换。

不知道这个新的类型和原来的类型在用起来有什么区别?

9 回复
stevewang
#1 stevewang • 2016-10-12 12:38

区别就是属于两种不同的类型。
好处是可以为新的类型定义一套独立的方法,C/C++里的typedef就没法做到这点,因为typedef只是定义一个别名而不是真正的新类型。

ssqq
#2 ssqq • 2016-10-12 15:11

我明白了,如果:

type A B

那么 A 将继承所有 B 的方法,但 B 依然只能使用自己的方法。

stevewang
#3 stevewang • 2016-10-12 15:23

不同类型之间的方法集是互相隔离的。
就你上面的例子而言,A并不会”继承”B的方法。
A对象要使用B类型的方法,必须做类型转换。

ssqq
#4 ssqq • 2016-10-12 15:46

不能使用方法,函数总是可以用的吧。

type estr string

estr 就可以使用所有 string 的相关函数,因为 string 本来就没有方法。

stevewang
#5 stevewang • 2016-10-12 16:15

以下代码编译失败:

type estr string

func f(s string) {}

func main(){
    var s estr = "hello"
    f(s)
}

错误信息:
cannot use s (type estr) as type string in argument to f

snake117
#6 snake117 • 2016-10-12 23:50

@ssqq

type A B只是让A获得B的内存模型而已。A不会继承B的方法,但A和B可以使用A()或B()来互相转换。

Simbory
#7 Simbory • 2016-10-13 09:56

@ssqq 不要用面向对象的类的思维来理解golang的type
你可以试一试这段代码

package main

// Estr the alias of the type string
type Estr string

func f(s string) {
    println(s)
}

func main() {
    var s Estr = Estr("hello")
    f(string(s))
}
joeonly
#8 joeonly • 2016-10-13 12:56

感觉没在用GO的思想编程。
GO的思想应该是这样抽出个接口吧,这样自然并且不需要转换。

以下代码只用于表意,没在真实环境运行过。

type T1 struct {
}

func (T1) f1() {
}

type T2 struct {
    T1
}

type myInterface interface {
    f1()
}

func main() {
    f2(T1{})
    f2(T2{})
}

func f2(T myInterface) {
    T.f1()
}
ayanmw
#9 ayanmw • 2018-11-16 22:18

我在goworld看到了type的一种用法,就是
type A=B
这样就可以实现真正的别名了,A和B是相同的,而且不能重复定义方法;
比如
`

type IntSlice []int
func(this*IntSlice)Get(index int){
//...
}
func(this*IntSlice)Push(num int){
//...
}
type IDSlice = IntSlice
var ids=IDSlice{}
ids.Push(1)
ids.Get(1)

`

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。