Golang基础知识(4)

46 阅读3分钟

16. init方法和import导包

init 早于 main

package main
​
import (
    "GoCode/lib1"
    "GoCode/lib2"
    "fmt"
)
func main() {
    lib1.Say1()
    lib2.Say()
}
​
===========
package lib1
​
import "fmt"
​
​
//函数名首字母大写 表示对外开放,如果是小写只能在本文件内使用
func Say1() {
    fmt.Print("this is lib1")
}
func init() {
    fmt.Print("lib1")
}
​
​

17.匿名包

同上 如果导入了包 但是不使用,编译器会报错

import (
    _ "GoCode/lib1"  //可以不执行包下的方法  会自动执行init方法
    mylib2"GoCode/lib2"//另起别名
    ."xxxx"  //相当于全部方法都进行了导入
)

18.defer语法

表示最后执行的进行的操作,类似于final. 并且多个执行顺序是压栈,先写后执行

fmt.Print("hello")
defer fmt.Print("main1 dd")
defer fmt.Print("main dd")
fmt.Print("hello")
=====
//hellohellomain ddmain1 dd

注: 当defer和return同时出现,return 语句会先执行(但return 语法是写在函数最后面)

19.map

1.声明方式

1.
var mymap map[int]string
mymap=make(map[int]string,10)
mymap[1]="dda"
2.
mymap1:=make(xxx)
3.
mymap2:=make(map[int]string,2){
    1:"dada"
}

2.改查

delete(mymap,"xxx")
mymap["xxx"]="xxxx"
​
=======
map 作为参数传递是一个引用传递,值会进行改变
func change(result map[string]string) {
    result["123"] = "www"
}

20.struct(结构体作为类)

type myint int
var a myint
fmt.Printf("%T",a) //myint
​
============
//类名大写 表示其他包导入后  也可以根据此进行创建
type Book struct {
    //小写表示私有
    name  string
    title string
}
var book Book
book.title = "da"
book.name = "dada"
fmt.Print(book) //{dada da}
//传参是一个值传递,结构体的副本。可以传结构体指针
func change(book *Book){
    
}
change(&book)

21.类的表示和封装

1.给结构体添加方法

func (this Book) getName() {
    fmt.Print(this.name + this.title)
}
func (b Book) getName() {
    fmt.Print(b.name + b.title)
}
func (this Book) setName(newName string){
    //这里的this只是调用该方法的对象的一个副本
    // 使用该方法不会起到什么作用
    this.name=newName
}
========= 优化 .(使用指针)
func (this *Book) setName(newName string){
    this.name=newName
}

22.继承

1.组合方式

type myBook struct {
    //继承直接在子类中 写上父类的结构体
    Book
    level int
}
​
==========  子类可以重写父类方法
//初始化,先进行父类的初始化,再进行子类新增变量的初始化
book := myBook{Book{"dada", "das"}, 1}
​
var book myBook //可以直接book.name  进行父类变量的初始化

23.多态

1.interface

//本质是一个指针
type Admin interface{
    
}
===
type Admin interface {
    sleep()
    GetColor() string
    GetType() string
}
type Cat struct {
    color string
}
​
func (this *Cat) sleep() {
    fmt.Print("cat is sleep")
}
func (this *Cat) GetColor() string {
    return this.color
}
func (this *Cat) GetType() string {
    return "Cat"
}
func main() {
    var admin Admin
    !!!
    admin = &Cat{"yello"} //通过取地址进行初始化
    admin.sleep()
    fmt.Print(admin.GetColor() + admin.GetType())
}
​
=========
func show(admin Admin) {
    admin.sleep()
    fmt.Print(admin.GetType() + admin.GetColor())
}
​
//main
cat := Cat{color: "yello"}
show(&cat)

多态基本要素:

1.有一个父类/接口

2.有子类(实现父类的全部接口)

3.父类类型的变量(指针)指向(引用)子类的具体数据变量

2.万能类型(空接口),断言

int,string,float... 都实现了interface接口

package main
​
import "fmt"func myFunc(arg interface{}) {
    fmt.Println("myFunc is called")
    fmt.Println(arg)
    //区分传入参数类型
    //给interface提供类型断言机制
    value,ok=arg.(string)
    value,ok=arg.(Book) //value是arg的值,ok是判断是否为该类型
}
​
type Book struct {
    auth string
}
​
func main() {
​
    book := Book{auth: "hello"}
    myFunc(book)
    myFunc("123")
    myFunc(123)
​
}
/*
myFunc is called
{hello}
myFunc is called
123
myFunc is called
123
*/
​
​