golang包
包可以区分命令空间(一个文件夹中不能有两个同名文件),也可以更好的管理项目。go中创建一个包,一般是创建一个文件夹,在给文件夹中的go文件中,使用package关键字声明包的名称,通常,文件夹名称和包名称相同,并且,同一个文件下只有一个包
Windows PowerShell(C) Microsoft Corporation。保留所有权利。PowerShell https://aka.ms/pscore6PS F:\AA-GoProject> go mod init lzy.com/AA-GoProjectgo: creating new go.mod: module lzy.com/AA-GoProjectgo: to add module requirements and sums:go mod tidyPS F:\AA-GoProject> cd .\service\PS F:\AA-GoProject\service> go buildPS F:\AA-GoProject\service>
go中的包管理工具gomod
创建一个新的项目AA-GoProject
customer_service中的代码:package serviceimport "fmt"func TestCustomerService() {fmt.Println("test customer service...")}
user_service中的代码
package serviceimport "fmt"func TestUserService() {fmt.Println("test uer service ....")}
main中的代码
package mainimport (//"fmt""net/http")import "github.com/gin-gonic/gin"//import "lzy.com/AA-GoProject/service"func main() {//fmt.Println("hello world")//service.TestUserService()//service.TestCustomerService()/*hello worldtest uer service ....test customer service...*/r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}
运行
GOROOT=C:\Program Files\Go #gosetupGOPATH=C:\Program Files\Go\bin;C:\Users\Admin\go #gosetup"C:\Program Files\Go\bin\go.exe" build -o C:\Users\Admin\AppData\Local\Temp\GoLand\___go_build_main_go.exe F:\AA-GoProject\main.go #gosetupC:\Users\Admin\AppData\Local\Temp\GoLand\___go_build_main_go.exe #gosetup[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env: export GIN_MODE=release- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /ping --> main.main.func1 (3 handlers)[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default[GIN-debug] Listening and serving HTTP on :8080[GIN] 2022/11/06 - 16:19:23 | 404 | 0s | ::1 | GET "/"[GIN] 2022/11/06 - 16:19:23 | 404 | 0s | ::1 | GET "/favicon.ico"
golang并发编程
go语言并发编程之协程
golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了Goroutines作为并发处理操作的一种方式
golang并发编程之协程通道channel
package main////import (// "fmt"// "math/rand"// "time"//)////// 创建int类型的通道,只能传入int类型值//var values = make(chan int)////func send() {// rand.Seed(time.Now().UnixNano())// value := rand.Intn(10)// fmt.Printf("send: %v\n", value)// time.Sleep(time.Second * 5)// values <- value////}////func main() {// //从通道接收值// defer close(values)// go send()// fmt.Println("wait...")// value := <-values// fmt.Printf("receive %v\n", value)// fmt.Println("end...")// /*// wait...// send: 4// receive 4// end...// *///}
go语言并发编程之WaitGroup实现同步
package mainimport "fmt"var c = make(chan int)func main() {go func() {for i := 0; i < 2; i++ {c <- i}close(c)}()//1.for range 读取c//for v := range c {// fmt.Printf("v:%v\n", v)//}/*v:0v:1*///2.for循环for i := 0; i < 3; i++ {r := <-cfmt.Printf("%v\n", r)}/*010*/}
go语言routime包
package main// Coshed的使用//func showMes(mes string) {// for i := 0; i < 2; i++ {// fmt.Printf("message:%v\n", mes)// }////}////func main() {// go showMes("java") // 开启子协程//// for i := 0; i < 2; i++ {// runtime.Gosched() // 表示现在有权利执行任务了,但是让给子协程去执行// fmt.Printf("golang\n")// }// fmt.Printf("end...")// /*// message:java// message:java// golang// golang// end...// */////}//-------------------------------go
package mainimport ("fmt""runtime""time")//cpu最大核心数func a() {for i := 0; i < 10; i++ {:%v\n", i)* time.Millisecond)}}func b() {for i := 0; i < 10; i++ {: %v\n", i)* time.Millisecond)}}func main() {查看现在的PU核心数:%v\n", runtime.NumCPU())将CPU数量修改为1//runtime.GOMAXPROCS(1)go a()go b()* time.Second)/*未修改CPU数量时执行情况,它会占用所有的CPU的核心数:12B: 0B: 1B: 2B: 3B: 4B: 5B: 6B: 7B: 8B: 9A:0A:1A:2A:3A:4A:5A:6A:7A:8A:9修改CPU的核心为1时,并且每个循环的等待100毫秒时的执行情况交替执行,并发执行B: 0A:0A:1B: 1B: 2A:2A:3B: 3B: 4A:4A:5B: 5B: 6A:6A:7B: 7A:8B: 8B: 9A:9*/}
package main////import (// "fmt"// "runtime"// "time"//)////func showNum() {// for i := 0; i < 10; i++ {// fmt.Printf("i:%v\n", i)// if i >=5 {// runtime.Goexit() // 协程退出// }// }////}////func main() {// go showNum()// time.Sleep(1 * time.Second)// /*// i:0// i:1// i:2// i:3// i:4// i:5// */////}
golang并发编程之mutex互斥锁实现
package mainimport ("fmt""sync""time")// golang并发编程Mutex互斥锁var i int = 100var wg sync.WaitGroupvar lock sync.Mutexfunc add() {defer wg.Done()//加锁操作lock.Lock()i += 1fmt.Printf("i++:%v\n", i)time.Sleep(100 * time.Microsecond)// 解锁lock.Unlock()}func sub() {lock.Lock()time.Sleep(100 * time.Millisecond)defer wg.Done()i -= 1fmt.Printf("i--:%v\n", i)lock.Unlock()}func main() {// 两个协程 不加锁的话最后的输出结果可能会有变化for i := 0; i < 100; i++ {wg.Add(1)go add()wg.Add(1)go sub()wg.Wait()}fmt.Printf("end i:%v\n", i)/*i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100i++:101i--:100i--:99i++:100i--:99i++:100i--:99i++:100i--:99i++:100end i:100*/}
golang并发编程之channel的遍历
package mainimport "fmt"var c = make(chan int)func main() {go func() {for i := 0; i < 2; i++ {c <- i}close(c)}()//1.for range 读取c//for v := range c {// fmt.Printf("v:%v\n", v)//}/*v:0v:1*///2.for循环for i := 0; i < 3; i++ {r := <-cfmt.Printf("%v\n", r)}/*010*/}


文章评论