Go语言编程-包+并发编程基础

2022年11月7日 207点热度 0人点赞 0条评论

告白气球

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 service
import "fmt"
func TestCustomerService() { fmt.Println("test customer service...")}

user_service中的代码

package service
import "fmt"
func TestUserService() { fmt.Println("test uer service ....")
}

main中的代码

package main
import ( //"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 world test 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 main
import "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:0 v:1 */ //2.for循环 for i := 0; i < 3; i++ { r := <-c fmt.Printf("%v\n", r) } /* 0 1 0 */}

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 main
import ( "fmt" "runtime" "time")
//cpu最大核心数
func a() { for i := 0; i < 10; i++ { fmt.Printf("A:%v\n", i) time.Sleep(100 * time.Millisecond) }
}func b() { for i := 0; i < 10; i++ { fmt.Printf("B: %v\n", i) time.Sleep(100 * time.Millisecond) }
}func main() { // 查看现在的PU核心数 fmt.Printf("runtime.NumCPU:%v\n", runtime.NumCPU()) // 将CPU数量修改为1 //runtime.GOMAXPROCS(1) go a() go b() time.Sleep(1 * time.Second) /* 未修改CPU数量时执行情况,它会占用所有的CPU的核心数 runtime.NumCPU:12 B: 0 B: 1 B: 2 B: 3 B: 4 B: 5 B: 6 B: 7 B: 8 B: 9 A:0 A:1 A:2 A:3 A:4 A:5 A:6 A:7 A:8 A:9 修改CPU的核心为1时,并且每个循环的等待100毫秒时的执行情况交替执行,并发执行 B: 0 A:0 A:1 B: 1 B: 2 A:2 A:3 B: 3 B: 4 A:4 A:5 B: 5 B: 6 A:6 A:7 B: 7 A:8 B: 8 B: 9 A: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 main
import ( "fmt" "sync" "time")// golang并发编程Mutex互斥锁
var i int = 100var wg sync.WaitGroupvar lock sync.Mutex
func add() { defer wg.Done() //加锁操作 lock.Lock() i += 1 fmt.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 -= 1 fmt.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--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i++:101 i--:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 i--:99 i++:100 end i:100 */
}

golang并发编程之channel的遍历

package main
import "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:0 v:1 */ //2.for循环 for i := 0; i < 3; i++ { r := <-c fmt.Printf("%v\n", r) } /* 0 1 0 */}

95200Go语言编程-包+并发编程基础

这个人很懒,什么都没留下

文章评论