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() }