doc .docx 点击下载打不开提示 403 Forbidden 是没有访问读取权限
设置 www 有权限即可下载打开了
lnmp .docx 403 Forbidden
接口 抽象 集合
多态 用接口实现变量
面向对象
//声明接口 interface
type Behavior interface{
Run() string
Eat() string
}
//动物
type Animal struct {
Colour string
}
// 狗
type Dog struct {
Animal
ID int
Name string
Age int
}
func main() {
var dog demo.Dog
dog.ID = 3
dog.Name = "struct"
dog.Colour = “red”
dog.Run()
}
并发实现:协程
启动协程
多核CPU设置
func Loop(){
for i:=1;i<11;i++{
time.Sleep(time.Microsecond * 5)
fat.Printf(format:”%d,”,i)
}
}
//并发 协程是并行的 runtime.NumCPC())最大运行CPU数目
runtime.GOMAXPROCS(runtime.NumCPC() -1) 留一个给系统用
go gorotine.Loop()
go gorotine.Loop()
time.Sleep(time.Second *s)
多协程的通讯
channel
select
var chanout chan bool = make(chan bool)
var chanInt chan int = make(chan int,10)
// 发送数据
func Send(){
chanInt <- 1
chanInt <- 2
chanInt <- 3
time.Sleep(time.Second *2)
timeout <- true
}
//接受数据
func Receive(){
// num := <- chanInt
//fat.Println(num)
// num := <- chanInt
//fat.Println(num)
// num := <- chanInt
//fat.Println(num)
for{
select{
case num := <- chanInt:
fat.Println(num)
case <-timeout:
fat.Println(timeout)
}
}
}
//启动发送数据的协程
go gorotine.Send()
//启动接受数据的协程
go gorotine.Receive()
多协程间的同步
系统工具 sync.waitgroup
Add(delta int) 添加记录
var WG sync.WaitGroup
//读取数据
func Read(){
for i:=0;i<3;i++{
WG.Add(delta:1)
}
}
//写入数据
func Write(){
for i:=0;i<3;i++{
time.Sleep(time.Second * 2)
WG.Done()
}
}
gorotine.Read()
go gorotine.Write()
gorotine.WG.wait()
fat.Println(“All done !”)
指针的基本作用
func TestPoint(){
var count int = 20
var countPoint *int
var countPoint1 *int
countPoint = &count 取 count变量的地址给指针
fmt.Println(&count) 变量的地址 c0000005
if countPoint != nil{
fmt.Println(countPoint) 指针 c0000005
fmt.Println(*countPoint) 取出指针指向地址的值 20
}
fat.Println(countPoint1) nil
}
指针的数组
func TestPointArr(){
//指针数组
a,b = 1,2
pointArr := […]*int(&a,&b)
fat.Println(pointer) [0X0000054058 0Xc0000054070] 指针数组
//数组指针
arr := […]int{3,4,5}
arrPoint := &arr
fat.Println(arrPoint) &[3 4 5] 数组指针
}
反序列化为结构体
func DeSerializeStruct(){
jsonString := ‘{“ip”:”198.0.0.1”,”name”:”Demo”,”port”:9090}’
server := new(server)
err := json.Unmarsh([]byte(jsonString),&server)
if err != err{
fat.Println(err.Error())
}
fat.Println(server)
}
反序列化为map
func DeSerializeMap(){
jsonString := ‘{“ip”:”198.0.0.1”,”name”:”Demo”,”port”:9090}’
server := make(map[string]interface{})
err := json.Unmarsh([]byte(jsonString),&server)
if err != err{
fat.Println(err.Error())
}
fat.Println(server)
}
序列化与反序列化
type Sever struct{
ServerName string `json:”name”` json序列号是name替换 ServerName
ServerIp string `json:”ip”`
ServerPort int `json:”port”`
}
func SerializeStuct(){
server := new(Server)
server.SeverName = “server”
server.ServerIp= “127.0.0.1”
server.ServerPort = 8080
b,eer := json.Marshal(server) //序列化成json 字节数组
if err != nil{
fat.Println(err.Error())
return
}
fat.Println(string(b)) // json字符串
}
func SerializeMap(){
server := make(map[string]interface{})
server[“SeverName”]= “server”
server[“ServerIp”]= “127.0.0.1”
server[“ServerPort”] = 8080
b,eer := json.Marshal(server) //序列化成json 字节数组
if err != nil{
fat.Println(err.Error())
return
}
fat.Println(string(b)) // json字符串
}
动物结构体和狗结构提组合
狗结构体可以实现继承动物结构体的所有属性和方法
//动物
type Animal struct {
Colour string
}
// 狗
type Dog struct {
Animal
ID int
Name string
Age int
}
func main() {
var dog demo.Dog
dog.ID = 3
dog.Name = "struct"
dog.Colour = “red”
dog.Run()
}
//定义结构体
type Dog struct {
ID int
Name string
Age int
}
//结构体方法
func (d *Dog) Run() {
fmt.Println(d.ID)
}
func main() {
var dog Dog
//var声明方式
dog.ID = 3
dog.Name = "struct"
dog.Age = 8
dog.Run()
}
//定义结构体type Dog struct { ID int Name string Age int}
//结构体测试func TestForStruct() { // var dog Dog //var声明方式 // dog.ID = 0 // dog.Name = "struct" // dog.Age = 8 //dog := Dog{ID: 1, Name: "sss", Age: 2} // := 方式
dog := new(Dog) // new方式 &{2 Tom 20} 传进去的是Dog 返回来的是指针 dog.ID = 2 dog.Name = "Tom" dog.Age = 20 fmt.Println(dog)
}
new
内存会置零
返回传入类型的指针地址
func newMap(){
mNewMap := new(map[int]string)
mMakeMap := make(map[int]string)
fmt.Println(a:”mNewMap:”,reflect.TypeOf(mNewMap)) // mNewMap: *map[int]string
fmt.Println(a:”mMakeMap:”,reflect.TypeOf(mMakeMap)) // mMakeMap: map[int]string
}
make
创建 slice 切片、 map键值对 、chan 管道线程之间通讯
返回类型引用
func makeSlice(){
mSlice := make([]string,3) //3长度是3
mSlice[0] = “dog”
mSlice[1] = “cat”
mSlice[2] = “tiger”
fat.Println(mSlice)
}
func makeMap(){
mMap := make(map[int]string)
mMap[10] = “dog”
mMap[100] = “cat”
fat.Println(mMap)
}
func makeChan(){
mChan := make(chan int , 3) //管道里面的容量是3 管道里面可以稍微存放3个数据
}