defer s.Add(1).Add(2).Add(5)
s.Add(3)
---> 1,2,3,5 defer会执行压栈操作,最后一个延迟调用
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()
}