go注意点

 

defer s.Add(1).Add(2).Add(5)    
s.Add(3)

---> 1,2,3,5    defer会执行压栈操作,最后一个延迟调用

 

new(type)   堆区
返回type类型的指针

 

make(type,len,cap)   堆区
声明一个type类型的变量,
当初始化时,len>0,接着append会有几个默认的空值;这时候需要通过下标指定

 

fmt.Println(stu.name) // 调用子结构体的name时,只能包含一个子name

 

    switch 2 {
    case 1, 2, 3, 4: //case值,不允许是浮点值
        fmt.Println("1")
        fallthrough //继续执行下一个语句
    case 5, 6:
        fmt.Println("3")
    default:
        fmt.Println("g")
    }

 

 

    type person struct {
        name string
        age  int
    }

    type student struct {
        *person
        name string
    }
    //var stu = student{
    //    person: person{
    //        name: "pension",
    //        age:  12,
    //    },
    //    name: "school",
    //}
    var stu student
    stu.person = new(person) // 必须开辟一块空间,否则person为nil,无法赋值
    stu.person.name = "asdas"
    fmt.Println(stu)
main.student{person:(*main.person)(0xc0000044a0), name:""}

结构体不能嵌套本结构体(递归嵌套);可以嵌套本结构的指针

 

封装、继承、多态

匿名字段、接口、方法
type Int int

func (I Int) add() {
    // 为Int类型绑定的方法, 必须大写     不允许*Int类型的调用
    fmt.Println(123)
}
func (I *Int) add() { 
   // 为*Int类型绑定的方法, 必须大写     ,但也允许Int类型直接调用
   //fmt.Println(123)
   *I += 1
   fmt.Println(*I)
}
以上两种格式,都会将原变量复制一份
只不过,一个是int,一个是*int


方法名可以和函数名重名

匿名字段可以直接调用父类方法

 

接口
type Int int func (I *Int) add() { fmt.Println(12123) } func (I *Int) sub(a int) (b int) { return 123 }
type asdsad interface { //接口名习惯以er结尾
    // 方法 函数声明   没有具体实现   具体的实现要根据对象不同,实现方式也不同
    // 方法列表
    xxx()
}

type interfaceName interface { //接口名习惯以er结尾 ,  该对象可以赋值给asdasd对象,因为  asdasd接口中的方法,本接口都有
    // 方法 函数声明   没有具体实现   具体的实现要根据对象不同,实现方式也不同
    // 方法列表
asdasd // 接口的继承
add() sub(a int) (b int) } func main() { var i Int i.add() // 定义接口类型 var h interfaceName h = &i // 接口中的方法,在具体的某个类型中都要实现 h.add() }

 

posted @ 2019-11-03 12:24  慕沁  阅读(183)  评论(0)    收藏  举报