go 不支持类型别名

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

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

共 9 个回复


stevewang

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

# 0

ssqq

我明白了,如果:

type A B

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

# 1

stevewang

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

# 2

ssqq

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

type estr string

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

# 3

stevewang

以下代码编译失败:

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

# 4

snake117

@ssqq

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

# 5

Simbory

@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))
}
# 6

joeonly

感觉没在用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()
}
# 7

ayanmw

我在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)

`

# 8