• 类型别名和自定义类型


    1 类型别名和原类型本质上是一样的,而自定义类型可以给其添加新的方法,

    package main
    import "fmt"
    
    //将int定义为自定义类型MyInt1
    type MyInt1 int
    type MyInt2 = int
    
    //SayHello 为MyInt1添加一个SayHello的方法
    func (m MyInt1) SayHello() {
        fmt.Println("Hello, 我是一个int。")
    }
    // 无法为类型别名添加方法,MyInt2只在代码中存在,编译完成时不会有该类型,并且不能为其添加方法
    //func (m MyInt2) SayHello() {
    //    fmt.Println("Hello, 我是一个int。")
    //}
    func main() {
        var m1 MyInt1
        m1.SayHello() //Hello, 我是一个int。
        m1 = 100
        fmt.Printf("%#v  %T
    ", m1, m1) //100  main.MyInt
    }
    View Code

    ​所以类型别名和类型定义最大的区别在于:类型别名和原类型是相同的,而类型定义和原类型是不同的两个类型。

    还有一个重要的区别在于类型定义的类型的方法集和原始类型的方法集没有任何关系,而类型别名和原始类型的方法集是一样的

    参考:https://fenggolang.github.io/2018/09/golang%E4%B8%AD%E7%B1%BB%E5%9E%8B%E5%88%AB%E5%90%8D%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%86%8D%E5%AE%9A%E4%B9%89/

    2 类型再定义后类型的方法集和潜在类型(即原先的类型)的方法集是一样的,博客里写错了,

    import "fmt"
    
    type s1 struct {
        name string
    }
    
    func (s1) sayName(name string)  {
        fmt.Println("my name is " + name)
    }
    
    type s2 = s1
    func main()  {
        a := s1{name: "Tom"}
        a.sayName(a.name)
        b := s2{name: "Jack"}
        b.sayName(b.name)
    }
    View Code

    tt

  • 相关阅读:
    轮播插件unsilder 源码解析(二)
    轮播插件unsilder 源码解析(一)---源码解析
    轮播插件unsilder 源码解析(一)---使用
    jquery插件扩展的学习
    基于canvas的陈列订货的分析
    grunt安装和使用教程
    2016订货会项目总结2
    2016工作项目完成总结
    不使用递归法求值
    easy bootstrap模板
  • 原文地址:https://www.cnblogs.com/xxswkl/p/14044063.html
Copyright © 2020-2023  润新知