- 自定义类型语法:
type newType oldType
package main
import (
"fmt"
"github.com/davecgh/go-spew/spew"
)
// Int64
// 新类型Int64是自定义类型
// 老类型int64是预定义类型
// 新类型Int64的用途是:
// 1.实现了max方法
// 2.用于获取两个int64中大的一方。
type Int64 int64
func (i Int64) max(n int64) int64 {
if int64(i) > n {
return int64(i)
}
return n
}
func main() {
var x int64
var y int64
x, y = 100, 200
z := Int64(x).max(y)
spew.Dump(z) // (int64) 200
fmt.Println(z) // 200
}
- oldType是类型字面量demo:
package main
// 以开源包go-redis代码片段举例
type clusterSlot struct {
start, end int
// 忽略一些字段
}
// clusterSlotSlice
// *重点看这里*
// 新类型clusterSlotSlice是自定义类型
// 老类型[]*clusterSlot是类型字面量
// 因为[]*clusterSlot不是自定义类型,也不是预定义类型。
// 新类型clusterSlotSlice的用途是:用于排序。
type clusterSlotSlice []*clusterSlot
func (p clusterSlotSlice) Len() int {
return len(p)
}
func (p clusterSlotSlice) Less(i, j int) bool {
return p[i].start < p[j].start
}
func (p clusterSlotSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func main() {
}
- oldType是自定义类型demo:
注:新类型不继承老类型的方法。
注:新类型继承老类型的操作,如:range,len,cap等。
package main
import "fmt"
// XiaoYiOne 创建一个自定义类型
// 老类型是类型字面量
type XiaoYiOne struct {
Name string
Age int64
}
// 返回姓名
func (xy1 XiaoYiOne) GetName() string {
return xy1.Name
}
// XiaoYiTwo 创建一个自定义类型
// 老类型是自定义类型
type XiaoYiTwo XiaoYiOne
// 返回年龄
func (xy2 XiaoYiTwo) GetAge() int64 {
return xy2.Age
}
func main() {
var xy1 XiaoYiOne
var xy2 XiaoYiTwo
xy1 = XiaoYiOne{
Name: "xiaoYi",
Age: 18,
}
xy2 = XiaoYiTwo(xy1)
fmt.Println(xy1.GetName())
fmt.Println(xy2.GetAge())
// 方法不继承
// Unresolved reference 'GetName'
fmt.Println(xy2.GetName)
}