后端开发

lnmp访问doc|docx等点击下载打不开提示 403 Forbidden

内容

doc .docx  点击下载打不开提示 403 Forbidden  是没有访问读取权限

设置 www 有权限即可下载打开了

lnmp  .docx  403 Forbidden

标签

doc

go接口

内容

接口    抽象  集合  


多态 用接口实现变量


面向对象  


//声明接口 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()

}




标签

go

go并发实现协程

内容

并发实现:协程

启动协程

多核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 !”)



标签

go

go 指针的基本作用

内容

指针的基本作用


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]  数组指针


}




标签

go

go json反序列化序列化

内容

反序列化为结构体

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字符串


}




标签

go

go结构体组合可以实现继承结构体的所有属性和方法

内容

动物结构体和狗结构提组合

狗结构体可以实现继承动物结构体的所有属性和方法

//动物

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

}

标签

go

go结构体方法struct的方法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()

}

标签

go

go结构体struct

内容

//定义结构体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)

}


标签

go

go 中的 new 和 make

内容

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个数据

}

标签

go

|{ value.name }