1. 自定义类型语法:
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
}
  1. 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() {

}
  1. 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) 
}