Go
零基础学习go
-天道酬勤-
有志者、事竟成,破釜沉舟,百二秦关终属楚; 苦心人、天不负,卧薪尝胆,三千越甲可吞吴。
展开
-
go使用protobuf
protocol buffers简介数据传输方式有:json和xml两种格式,其中json更多一些。现在又多了一种数据传输方式,就是google开发的Protocol BuffersProtocol Buffers一个字“快”。一条消息数据,用protobuf序列化后的大小是json的10分之一,是xml格式的20分之一,但是性能却是它们的5~100倍下载protocol buffers编译器https://github.com/protocolbuffers/protobuf点击右侧rele原创 2022-04-11 15:26:53 · 2946 阅读 · 0 评论 -
grpc远程进程调用
grpc实现rpc方法一net/rpc库服务端代码package mainimport ( "fmt" "log" "net" "net/http" "net/rpc" "os")// 算术运算结构体type Arith struct {}// 算术运算请求结构体type ArithRequest struct { A int B int}// 算术运算响应结构体type ArithResponse struct { Res int}// 加法方法实原创 2022-04-11 15:26:02 · 2802 阅读 · 0 评论 -
golang标准库中http包
http.Get()package mainimport ( "fmt" "io/ioutil" "log" "net/http")func testGet() { key := "***********************" url := "http://apis.juhe.cn/simpleWeather/query?city=北京&key=" + key r, err := http.Get(url) if err != nil { log.Fatal(e原创 2022-03-14 20:49:43 · 418 阅读 · 0 评论 -
golang标准库中template包
基本使用package mainimport ( "html/template" "log" "os")func main() { // 定义变量 name := "xf" // 定义模板 muban := "hello {{.}}" // 解析模板 t, err := template.New("test").Parse(muban) if err != nil { log.Fatal(err) } // 执行模板函数 输出到终端 err2 := t.Execut原创 2022-03-15 11:36:41 · 419 阅读 · 0 评论 -
httpRouter路由
下载httprouterhttps://pkg.go.dev/github.com/julienschmidt/httproutergo get github.com/julienschmidt/httprouter测试gopackage mainimport ( "fmt" "log" "net/http" "github.com/julienschmidt/httprouter")func Index(w http.ResponseWriter, r *http.Reque原创 2022-03-15 13:38:16 · 554 阅读 · 0 评论 -
golang操作mongodb数据库
下载安装驱动并连接数据库下载地址https://www.mongodb.com/try/download/community打开客户端在这里插入代码片创建数据库在这里插入代码片创建集合在这里插入代码片下载驱动在这里插入代码片...原创 2022-03-07 16:52:33 · 3492 阅读 · 0 评论 -
golang操作mysql数据库
安装mysql驱动获得数据库连接插入数据查询数据更新数据删除数据原创 2022-03-07 11:26:46 · 1606 阅读 · 0 评论 -
golang标准库中的xml包
两个核心函数Marshal Unmarshal结构体转xmlfunc test1() { type Address struct { City, State string } type Person struct { XMLName xml.Name `xml:"person"` Id int `xml:"id,attr"` FirstName string `xml:"name>first"` LastName string `xm原创 2022-03-06 16:49:55 · 534 阅读 · 0 评论 -
golang标准库中的json包
两个核心函数Marshal Unmarshal结构体转jsonfunc test1() { type ColorGroup struct { ID int Name string Colors []string } group := ColorGroup{ ID: 1, Name: "Reds", Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, } fmt.Printf("group:原创 2022-03-06 15:47:36 · 528 阅读 · 0 评论 -
golang标准库中的time包
基本使用func test1() { // now 为time.Time Month为time.Month t := time.Now() fmt.Printf("t: %v\n", t) // t: 2022-03-06 10:58:34.229841 +0800 CST m=+0.012645201 year := t.Year() month := t.Month() day := t.Day() hour := t.Hour() minute := t.Minute() sec原创 2022-03-06 11:27:14 · 490 阅读 · 0 评论 -
golang标准库中的sort包
package mainimport ( "fmt" "sort")func main() { // https://pkg.go.dev/sort#Ints s := []int{2, 4, 1, 3} // 排序正序 sort.Ints(s) fmt.Printf("s: %v\n", s) // s: [1 2 3 4] f := []float64{1.1, 4.4, 5.5, 3.3, 2.2} sort.Float64s(f) fmt.Printf("f: %v原创 2022-03-05 17:43:24 · 179 阅读 · 0 评论 -
golang标准库log
log.Printlog.Print("my log")log.Printf("my log %d", 100)name := "tom"age := 10log.Println(name, " ", age)log.Panicdefer fmt.Println("panic结束后在执行...")log.Panic("my panic")fmt.Println("end...")后面的end…不会输出,但是defer会执行log.Fataldefer fmt.Println(原创 2022-03-05 16:26:13 · 800 阅读 · 0 评论 -
golang标准库io包
package mainimport ( "bytes" "fmt" "io" "log" "os" "strings")func copy1() { r := strings.NewReader("wang fan") buf := make([]byte, 20) r.Read(buf) fmt.Printf("string(buf): %v\n", string(buf))}func copy2() { r := strings.NewReader("hello原创 2022-03-05 14:41:30 · 317 阅读 · 0 评论 -
golang标准库ioutil包
package mainimport ( "fmt" "io/ioutil" "log" "os")func test1() { // r := strings.NewReader("Go is a general-purpose language designed with systems programming in mind.") f, _ := os.Open("a1.txt") //File实现了Reader defer f.Close() b, err := iouti原创 2022-03-05 15:14:29 · 219 阅读 · 0 评论 -
golang标准库os模块-文件目录相关
package mainimport ( "fmt" "os")// 创建文件func createFile() { f, err := os.Create("test.txt") if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("f: %v\n", f) }}// 创建目录func createDir() { // 创建单个目录 /* err := os.Mkdir("test",原创 2022-03-01 15:42:56 · 820 阅读 · 0 评论 -
golang标准库os模块-File文件读操作
package mainimport ( "fmt" "io" "os")// 打开关闭文件func openCloseFile() { // 只能读 /* func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) } */ f, _ := os.Open("test2.txt") fmt.Printf("f.Name(): %v\n", f.Name()) // 根据第二个参数原创 2022-03-01 17:40:38 · 608 阅读 · 0 评论 -
golang标准库os模块-File文件写操作
package mainimport ( "fmt" "os")// 写字节数组func write() { f, err := os.OpenFile("a2.txt", os.O_RDWR|os.O_APPEND, 0775) if err != nil { fmt.Printf("err: %v\n", err) // 文件不存在时候:err: open a22.txt: The system cannot find the file specified. } else原创 2022-03-03 11:04:53 · 556 阅读 · 0 评论 -
golang标准库os模块-进程相关操作
golang标准库os模块-进程相关操作原创 2022-03-03 13:47:55 · 543 阅读 · 1 评论 -
golang标准库os模块-环境相关
package mainimport ( "fmt" "os")func main() { // 获取所有环境变量 s := os.Environ() fmt.Printf("s: %v\n", s) fmt.Println("-----------------") // 获取某个环境变量 s2 := os.Getenv("GOPATH") fmt.Printf("s2: %v\n", s2) fmt.Println("-----------------") // 设置环境变原创 2022-03-03 15:33:32 · 204 阅读 · 0 评论 -
golang并发编程之协程
通过 go 关键字来开启 goroutine 即可package mainimport ( "fmt" "time")func test(msg string) { for i := 0; i < 3; i++ { fmt.Printf("msg: %v--%v\n", msg, i) time.Sleep(time.Millisecond * 100) }}func main() { go test("first") test("second") fmt.P原创 2022-02-28 10:45:36 · 65 阅读 · 0 评论 -
golang并发编程之通道channel
golang并发编程之通道channelGo 提供了一种称为通道的机制,用于在 goroutine 之间共享数据。当您作为 goroutine 执行并发活动时,需要在 goroutine 之间共享资源或数据,通道充当 goroutine 之间的管道(管道)并提供一种机制来保证同步交换。需要在声明通道时指定数据类型。我们可以共享内置、命名、结构和引用类型的值和指针。数据在通道上传递:在任何给定时间只有一个 goroutine 可以访问数据项:因此按照设计不会发生数据竞争。根据数据交换的行为,有两种类型的原创 2022-02-27 20:50:39 · 473 阅读 · 0 评论 -
golang并发编程之WaitGroup实现同步
package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc hello(i int) { // Goroutine结束就会登记-1 defer wg.Done() // defer wg.Add(-1) fmt.Println("Hello Goroutine ", i)}func main() { for i := 0; i < 10; i++ { // 启动一个Goroutine就会登记+1 wg原创 2022-02-27 21:14:40 · 70 阅读 · 0 评论 -
golang并发编程之runtime包
golang并发编程之runtime包runtime.Goexit()–退出当前协程package mainimport ( "fmt" "runtime" "time")func test() { for i := 0; i < 10; i++ { if i > 3 { runtime.Goexit() } fmt.Printf("i: %v\n", i) }}func main() { go test() time.Sleep(time.S原创 2022-02-28 14:11:59 · 168 阅读 · 0 评论 -
golang并发编程之Mutex互斥锁实现同步
golang并发编程之Mutex互斥锁实现同步package mainimport ( "fmt" "sync" "time")// 共享资源var m int = 1var lock sync.Mutexvar wt sync.WaitGroupfunc add() { defer wt.Done() lock.Lock() m += 1 time.Sleep(time.Millisecond * 5) lock.Unlock()}func sub() { d原创 2022-02-28 15:02:10 · 148 阅读 · 0 评论 -
golang并发编程之channel的遍历
golang并发编程之channel的遍历方法1 for rangepackage mainimport "fmt"func main() { c := make(chan int) go func() { for i := 0; i < 10; i++ { c <- i } close(c) }() for v := range c { fmt.Printf("v: %v\n", v) }}运行结果方法2 for循环+if判断pa原创 2022-02-28 17:06:43 · 576 阅读 · 0 评论 -
golang并发编程之select
golang并发编程之selectGo里面提供了一个关键字select,类似于switch语句。用于处理异步IO操作。通过select可以监听channel上的数据流动。当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。select中的case语句必须是一个channel操作select中的default子句总是可运行的如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。如果没有可运行的case语句,且有default语句,那么就会执原创 2022-02-28 17:38:16 · 243 阅读 · 0 评论 -
golang并发编程之Timer
package mainimport ( "fmt" "time")func main() { timer1 := time.NewTimer(time.Second * 2) t1 := time.Now() fmt.Printf("t1: %v\n", t1) t2 := <-timer1.C fmt.Printf("t2: %v\n", t2) // 如果只是想单纯的等待的话,可以使用 time.Sleep 来实现 timer2 := time.NewTimer(t原创 2022-02-28 17:56:05 · 527 阅读 · 0 评论 -
golang并发编程之Ticker
golang并发编程之TickerTimer只执行一次,Ticker可以周期的执行icker是一个定时触发的计时器它会以一个间隔(interval)往channel发送一个事件(当前时间)而channel的接收者可以以固定的时间间隔从channel中读取事件package mainimport ( "fmt" "time")func main() { // 创建定时器,每隔1秒后,定时器就会给channel发送一个事件(当前时间) ticker := time.NewTicker原创 2022-03-01 09:51:31 · 2040 阅读 · 0 评论 -
golang并发编程之原子操作
golang并发编程之原子操作案例展示package mainimport ( "fmt" "sync/atomic" "time")var i int32 = 100func add() { atomic.AddInt32(&i, 1)}func sub() { atomic.AddInt32(&i, -1)}func main() { for i := 0; i < 200; i++ { go add() go sub() }原创 2022-03-01 11:52:10 · 300 阅读 · 0 评论 -
golang接口
golang接口Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。/* 定义接口 */type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type] ... method_namen [return_type]}/* 定义结构体 *原创 2022-02-28 10:25:37 · 198 阅读 · 0 评论 -
golang接口值类型接收者和指针类型接收者
golang接口值类型接收者和指针类型接收者值接受者是一个拷贝是一个副本,指针接受者传递的是指针定义接口和结构体type Pet interface { eat()}type Dog struct { name string}实现接口 接受者是值类型func (dog Dog) eat() { fmt.Printf("dog: %p\n", &dog) fmt.Println("dog eat...") dog.name = "嘿嘿"}测试代码dog := D原创 2022-02-28 10:20:36 · 437 阅读 · 3 评论 -
golang接口和类型的关系
golang接口和类型的关系一个类型可以实现多个接口多个类型可以实现同一个接口(多态)一个类型实现多个接口定义两个接口一个结构体,结构体方法实现接口方法type Player interface { playMusic()}type Video interface { playVideo()}type Mobile struct {}func (m Mobile) playMusic() { fmt.Println("播放音乐")}func (m Mobile) pl原创 2022-02-28 09:54:52 · 142 阅读 · 0 评论 -
golang接口嵌套
package mainimport "fmt"// 创建第一个接口type Flyer interface { fly()}// 创建第二个接口type Swimmer interface { swim()}// 组合第一和第二个接口type FlySwim interface { Flyer Swimmer}// 创建一个结构体type Fish struct {}// 实现组合的接口func (fish Fish) fly() { fmt.Print原创 2022-02-28 09:40:44 · 207 阅读 · 0 评论 -
【02内建容器】
数组切片的概念切片的操作MapMap例题字符和字符串处理原创 2022-02-17 11:51:58 · 358 阅读 · 0 评论 -
【01安装环境与基础语法】
下载地址https://studygolang.com/dl一直下一步就ok(前面不用管gopath那些)创建自己写代码的文件夹C:\Program Files\Go\src\shiku.wangfan先从你好世界开始package mainimport "fmt"var ( aa = 3 ss = "KKK" bb = true)func variableZeroValue() { var a int var s string fmt.Printf("%d %q\n原创 2022-02-16 18:05:45 · 260 阅读 · 0 评论