![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
程序彤
无废话,纯干货。
展开
-
gRPC之流模式
服务端流业务场景:用户积分.proto代码// 用户积分模块message UserInfo{ int32 user_id=1; int32 user_score=2;}message UserScoreRequest{ repeated UserInfo users = 1;}message UserScoreResponse{ repeated UserInfo users =1;}service UserService{ rpc GetUserScore(原创 2021-06-22 09:52:47 · 264 阅读 · 0 评论 -
gRPC之双向认证初入
生成.pem和.key文件server.go文件package mainimport ( "crypto/tls" "crypto/x509" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "io/ioutil" "learnProto/services/proto" "net")func main(){ cert, _ := tls.LoadX509KeyPair("cert/server.pe.原创 2021-06-18 21:30:24 · 370 阅读 · 0 评论 -
gRPC之.proto生成go文件并创建grpc服务端
第一次生成:protoc --go_out=…/services Product.proto修改proto后重新生成:protoc --go-grpc_out=…/services Product.proto创建ProductService.gopackage protoimport "context"type ProdService struct {}func (this *ProdService) mustEmbedUnimplementedProdServiceServer.原创 2021-06-18 21:27:47 · 643 阅读 · 0 评论 -
goweb之书城基本CRUD增删改查
无法加载静态资源在主函数中添加一条语句:// 设置处理静态资源 http.Handle("/static/",http.StripPrefix("/static/",http.FileServer(http.Dir("views/static")))) http.HandleFunc("/index",IndexHandler) http.ListenAndServe(":8080",nil)以static打头的以内静态资源得到访问,但是pages下的login/cart等还需再次配置./原创 2021-06-11 19:58:48 · 303 阅读 · 1 评论 -
Go语言之Socket网络编程
Go网络编程server.gopackage mainimport ( "fmt" "net")func main() { fmt.Println("服务器开始监听") listen,err:=net.Listen("tcp","127.0.0.1:8888") if err!=nil{ fmt.Printf("listen err=",err) return } defer listen.Close() // 延时关闭listen for { fmt.Print原创 2021-06-07 16:31:02 · 259 阅读 · 0 评论 -
Go语言之反射入门
Go反射通过反射获取num变量的值package mainimport ( "fmt" "reflect")func main() { var num int = 6 reflectTest01(num)}func reflectTest01(b interface{}){ rType := reflect.TypeOf(b) fmt.Printf("rType= %v,类型是%T\n",rType,rType) rValue := reflect.ValueOf(b)原创 2021-06-06 15:06:19 · 113 阅读 · 0 评论 -
Go语言之协程gorouinte与管道channel
写方法延迟3秒,读方法瞬间执行有一次,故显得很急,刚写一个就读出来了,故intChan管道永远长度都为0。package mainimport ( "fmt" "time")/*向intChan管道存入从0逐渐递增的自然数 */func storeData(intChan chan int){ for i := 0; i < 10; i++ { // 写10个数据,管道 // 向管道存 intChan <- i fmt.Println("storeData存了原创 2021-06-05 22:53:38 · 208 阅读 · 2 评论 -
Go语言之gorountine与管道初体验
Go之gorountine一个go线程上,可以启动多个协程。协程是轻量级的线程。特点:有独立的栈空间共享程序堆空间调度由用户控制是轻量级的线程go的协程机制,可以轻松的开启上万个协程。其他编程语言的并发机制基于线程,开启过多的线程,它们的资源耗费大。package mainimport ( "fmt" "strconv" "time")func main(){ go test() // main主线程和test协程同时执行 for i := 0; i < 5;原创 2021-06-05 15:50:37 · 622 阅读 · 2 评论 -
Go语言之文件操作
文件打开、关闭文件与读取文件内容(带缓冲读)package mainimport ( "bufio" "fmt" "io" "os")func main() { file ,err := os.Open("F:\\lwt.txt") if err != nil{ fmt.Println("err=",err) } //fmt.Printf("file:%v",file) reader := bufio.NewReader(file) for{ str,err :原创 2021-06-04 10:53:22 · 82 阅读 · 0 评论 -
Go语言之面向对象-多态与类型断言
类型断言使用方法:接口实例.(具体结构体子类)。综合使用:if 子类实例名,ok := 接口实例.(子类);ok{如果true子类实现了该接口,即进行一系列处理} // 调用猫猫特有的喵喵方法。 if cat,ok := animal.(Cat);ok{ // 如果类型断言是cat成功 cat.Miao() }package mainimport "fmt"func main() { //zoo:=Zoo{} //cat:=Cat{} //dog:=Dog{} //原创 2021-06-03 18:32:50 · 159 阅读 · 0 评论 -
go语言面向对象之接口
go接口接口中不允许有除了只声明方法外的其他变量定义type 接口名 interface{ method1(参数列表) 返回值列表 method2(参数列表) 返回值列表}go的接口不需要显式实现,只要一个变量,含有接口类型中的所有方法,name这个变量就实现了这个接口,编译器底层优化检测。package mainimport "fmt"func main() { zoo:=Zoo{} cat:=Cat{} dog:=Dog{} // 多态 zoo.coming(cat原创 2021-06-02 22:42:35 · 83 阅读 · 0 评论 -
go语言之多继承 匿名结构体与匿名结构体指针
go继承其他结构体不需要重新定义这些属性和方法,只需要嵌套一个Student匿名结构体。使用:直接 放另一个结构体名package mainimport "fmt"func main() { // 小学生 pupil := &pupil{} pupil.Student1.Name = "lwt小" pupil.Student1.Age = 11 pupil.exam() pupil.Student1.SetScore(99) pupil.Student1.ShowIn原创 2021-06-02 21:55:31 · 564 阅读 · 0 评论 -
Go语言的其他包小写变量名引用(俗称工厂模式)
定义package modeltype Student struct{ Name string Score float64}// 当结构体为小写时type person struct{ Name string score float64}func NewPerson(n string,s float64) *person{ return &person{ Name : n, score:s, }}func (p *person) GetScore() .原创 2021-06-02 11:13:47 · 427 阅读 · 0 评论 -
Go语言之面向对象-方法
golang的方法作用在指定数据类型上,和指定的数据类型绑定,因此自定义类型都可以有方法,而不仅仅是struct声明和调用type A struct{Num int}func (a A) test{fmt.Println(a.Num)}表示A结构体的方法为test()package mainimport( "fmt" "encoding/json")func main(){ monster1 := Monster{"李威彤",21} fmt.Println(monste原创 2021-06-01 12:08:17 · 104 阅读 · 0 评论 -
Go语言简易的面向对象之结构体和从此突破指针
go的面向对象结构体定义type 结构体名称 struct{field1 typefield2 type}结构体名称若为大写,则其他包也能引用该结构体指针,slice,map的零值都为nil,slice和map使用前必须make结构体的声明(4种方式)var student1 Studentvar student2 Student = Student{“李威彤”,20,}var student3 *Student = new(Student)var student4 *Stu原创 2021-05-31 20:10:41 · 98 阅读 · 0 评论 -
Go语言之map与结构体初入
mapmap的声明不会分配内存,而数组一旦声明即分配内存。var map1 map[string]stringvar map2 map[string]map[string]string故声明后必须make,给map分配数据空间map的key重复后将会被覆盖map是无序的map的遍历(for-range)package mainimport( "fmt")func main(){ map1 := make(map[string]string) map1["lwt1"]="11原创 2021-05-31 16:47:12 · 216 阅读 · 0 评论 -
Go语言之冒泡排序算法和二分查找算法
Go语言之冒泡排序package mainimport( "fmt")func main(){ var arr [5]int = [5]int{24,69,57,80,13} bubbleSort(&arr) fmt.Println(arr)}func bubbleSort(arr *[5]int){ // fmt.Println(*arr) // 这里必须加*,代表取地址的值 for i:=0;i<4;i++{ for j:=0;j<4-i;j++{原创 2021-05-30 14:37:12 · 68 阅读 · 0 评论 -
Go语言之slice切面
切片创建方式一package mainimport( "fmt")// 切片func main(){ var arr = [...]int{1,2,3,4,5} // 声明一个切片 slice := arr[2:4] // slice引用到arr这个数组的[1,3)下标 fmt.Println("arr:",arr) fmt.Println("slice元素:",slice) fmt.Println("slice长度:",len(slice)) fmt.Println("s原创 2021-05-29 22:21:04 · 353 阅读 · 0 评论 -
Go语言与Java语言的区别,必须区别。
var arr []int,这是arr是一个切片slice。而不是数组。切片和数组有区别原创 2021-05-29 10:54:41 · 427 阅读 · 1 评论 -
Go语言之字符串函数和日期函数与格式化
字符串函数package mainimport( "fmt" "strconv" "strings")func main(){ str1 := "李威彤" str2 := []rune(str1) for i:=0;i<len(str2);i++{ fmt.Printf("%c\n",str2[i]) } // 字符串转为整数 n,err := strconv.Atoi("123") if err != nil{ fmt.Println("出错了:",err)原创 2021-05-28 16:29:16 · 195 阅读 · 0 评论 -
Go语言之全局变量定义、函数内部局部变量定义和defer关键字和值类型与引用类型
定义全局变量函数必须使用var + 名 + type = ?进行定义而定义局部变量(函数内部的变量)可使用 名:=?直接简短声明定义原创 2021-05-27 13:02:31 · 1839 阅读 · 0 评论 -
Go语言之函数可变参数、intit()函数、匿名函数和闭包
函数的可变参数// 可变参数的使用,可变参数必须放在函数的形参列表的末尾func sum(n1 int,args... int) int{ sum := n1 for i:=0;i<len(args);i++{ sum+=args[i] // 取出切片中第一个元素值 } return sum}init函数utils.gopackage utils // 这两个全局变量在test2.go中使用var Age intvar Name stringfunc init()原创 2021-05-14 22:21:04 · 365 阅读 · 0 评论 -
Go语言之函数使用
go语言跨包调函数引入其他包所在位置,从$GOPATH路径下的src去定位。使用包名.大写函数名 跨包调用函数使用包名.大写变量名 跨包调用变量main/main.gopackage mainimport( "fmt" "go_code/day0513/utils")func main(){ var a int = 6 var b int = 2 var operator byte = '-' result := utils.Cal(a,b,operator) fmt.Pri原创 2021-05-13 17:10:42 · 154 阅读 · 0 评论 -
Go语言之for的五种用法和生成99这个随机数
for循环五种用法package mainimport( "fmt")func main(){ // 1 for i := 1;i<=10;i++{ fmt.Println("ok") } j:=0 // 2 for j<10{ fmt.Println(j) j++ } // 3 k:=0 for{ k++; fmt.Println("k",k) if(k==10){ break } } // 4 遍历字符串和数组 va原创 2021-05-12 16:48:21 · 298 阅读 · 0 评论 -
go语言之访问权限、运算符、控制台输入
go访问权限变量名、函数名、常量名首字母大写,则可以被其他包访问,如果首字母小写,则只能在本包中使用。(首字母大写为共有,首字母小写为私有)运算符++/- -只能独立使用,且go中无前++和前- - 。go不支持三元运算符控制台输入package mainimport( "fmt")func main(){ var name string var age byte var sal float32 var isMan bool // Scanln() fmt.Print原创 2021-05-10 19:27:47 · 337 阅读 · 0 评论 -
go语言之字符串、类型转换、string和基本数据类型相互转换
go字符串由字节组成定义一个字节时,必须通过var b1 byte = ‘a’通过fmt.Printf("%c,%d",b1,b1)格式化输出go统一使用utf-8编码,统一,不会有乱码问题。ASCII码和utf-8编码,utf-8包括ascii码,即兼容ascii码go的字符串是不可变的可使用反引号``输出真实文本。+加号必须放在末尾,才可换行基本数据类型手动强制转换高精度与低精度之间,必须显示转换。T(v):类型(变量)type(value)值本身原创 2021-05-09 18:47:53 · 601 阅读 · 0 评论