golang包
包可以区分命令空间(一个文件夹中不能有两个同名文件),也可以更好的管理项目。go中创建一个包,一般是创建一个文件夹,在给文件夹中的go文件中,使用package关键字声明包的名称,通常,文件夹名称和包名称相同,并且,同一个文件下只有一个包
Windows PowerShell
(C) Microsoft Corporation。保留所有权利。
PowerShell https://aka.ms/pscore6
PS F:\AA-GoProject> go mod init lzy.com/AA-GoProject
go: creating new go.mod: module lzy.com/AA-GoProject
go: to add module requirements and sums:
go mod tidy
PS F:\AA-GoProject> cd .\service\
PS F:\AA-GoProject\service> go build
PS 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 #gosetup
GOPATH=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 #gosetup
C:\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++ {
%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的核心数
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 = 100
var wg sync.WaitGroup
var 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
*/
}
文章评论