go 进阶

高阶知识

fmt标准库

//输出函数
//Print函数:Println函数会在输出内容的结尾添加一个换行符
//Fprint函数输出到一个io.Writer接口类型的变量w中

自定义类型

type myint int //自定义类型
type yourint = int //类型别名

结构体

1.定义

//定义结构体
type person struct {
	name  string
	age   int
	hobby []string
}
//key-value初始化
var p2 = person{
    name: "元素",
    age: 11,
    hobby:[]string{"1","2","3"}
}
//用值初始化,值的顺序要跟定义时一样
p3 := person{
    "lisa",
    22,
    []string{"sd","ddd"}
}

//匿名结构体 多用于临时场景
var s struct{
    name string
    age int
}
//指针类型的结构体
var p = new(person) //指針類型

//结构体匿名字段
type hello struct{
    int
    int
}
//嵌套
type address struct{
    city string
}
type person struct{
    name string
    address
}
//p.city => p.address.city
//匿名嵌套时 先在自己的结构体找对应字段,再去嵌套的里面找字段

2.结构体内存

//内存分配:一个结构体是一段连续的内存
//进阶:内存对齐

3.结构体的继承

type animal struct{
    name string
}
func (a animal)move(){
    //do something
}
//子类 dog
type dog struct{
    feet int
    *animal
}
func (d dog) wang() {
    //do sth
}
//调用
func main() {
    d := dog{
        animal:animal{name:"xx"},
        feet:4,
    }
    d.wang()
    d.move()
}

4.结构体与JSON


方法

//定义:是一种特殊的函数,是作用于特定类型的函数
func (接收变量 接收者类型) 方法名(参数列表)(返回参数){
}
//定义dog结构体
type dog struct{
    name string
}
//构造函数 new开头首字母大写
func newDog(name string) {
    return dog{
        name: name,
    }
}
//方法  接收者表示调用该方法的类型变量,多用类型名的首字母小写表示
func (d dog) wang() {
    //do something
}
//go中如果首字母大写,表示对外部可见(公有的public)
// Cat 这是一个猫
type Cat struct{
    name
}
//可以给任意类型添加方法,但仅限在同一个包package
//使用指针类型接收者
/*
1.需要修改接收者中的值
2.接收者是拷贝代价大的对象
3.保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者
*/

接口interface

//接口是一种类型,规定了变量有哪些方法
type 接口名 interface{
    接口方法(参数值)(返回值)
    ...
}
//接口的实现
//一个变量如果实现了所有的方法,那么这个变量就实现了这个接口


//指针实现接口,接口可以嵌套

//空接口
type xx interface{
	//所有的类型都实现了空接口,任意类型都可以传入空接口    
}
interface{} //空接口没必要写名字,通常用这个定义

package

//包中的变量或方法等如果是小写则只能在当前包调用
//大写的时候可以供外部调用
posted @ 2020-11-12 22:40  decoo  阅读(95)  评论(0)    收藏  举报