Golang基础 一揽子方案
1. go mod tidy 自动下载所有依赖
2. 安装ptotobuf
https://github.com/protocolbuffers/protobuf/releases
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
//protoc -I . helloworld.proto --go_out=plugins=grpc:.
//protoc --go_out=. helloworld.proto
protoc --go-grpc_out=. helloworld.proto
3.slice、map、chan
Golang 默认都是采用值传递,有些值天生就是指针:slice、map、channel。声明后还需要初始化make分配内存
3.1 :=不能声明全局变量//推导变量类型不支持全局变量声明
3.2 iota 仅可以和 const一起使用来定义有规则的枚举
3.3 defer 延迟处理并压栈(在return之后执行,先入后出,后入先出)
3.4 slice(动态数组),动态数组引用传值,且形参一致
slice4种声明方式
myslice1 := []int{1,2,3}
var myslice2 []int
myslice2 = make([]int, 3)
var myslice3 []int = make([]int, 3)
myslice4 := make([]int, 3)
注意:定长数组是值传递,slice 是指针传递,slice切片是左闭右开。
map3种声明方式
var myMap1 map[string]string
myMap1 = make(map[string]string, 10)
myMap1["one"] = "aaa"
myMap2 := make(map[int]string)
myMap2[1] = "aaa"
myMap3 := make(map[string]string) {
"one": "aaa",
"two": "bbb",
}
4.chan的声明和使用
ch1 := make(chan Type) //等价于make(chan Type, 0)
ch2 := make(chan Type, capacity)
channel <- value //发送value到channel
<-channel //接收并将其丢弃
x := <-channel //从channel中接收数据,并赋值给x
x, ok := <-channel //同上,同时检查通道是否已关闭或为空
报错package xxx is not in GOROOT or GOPATH
解决:初始化一个go.mod,...\Go\GolangStudy\5-init> go mod init 5-init,然后使用时import "5-init"即可
5. 结构的声明和实例化
// 类声明
type Person struct {
Name string
Age int
Doc []string // slice切片
}
// 类方法声明-传递值对象
func (p *Person) P1() {
p.Name = "Tinywan"
p.Age = 24
}
// 类方法声明-传递指针对象
func (p *Person) P2() {
p.Name = "Tinyaiai"
p.Age = 22
}
func main() {
// 实例化对象 实例化的时候可以初始化属性值,如果没有指明则默认为系统默认值
p1 := &Person{}
p1.Name = "ShaoBo Wan"
p1.Age = 20
p2 := &Person{Name:"HaHa"}
p3 := new(Person)
p3.Name = "New Name"
p4 := Person{}
p4.Name = "Name 001"
p4.Age = 26
p5 := Person{Name:"Name 002",Age:28}
// 使用中如果包含数组(动态数组 slice切片),结构体的实例化需要加上类型如上如果intro的类型是[]string
p6 := &Person{
"zhangsan",
25,
[]string{"lisi", "wangwu"},
}
fmt.Println(p1, "\n", p2, "\n", p3, "\n", p4, "\n", p5, "\n", p6, "\n")
//&{ShaoBo Wan 20 []} &{HaHa 0 []} &{New Name 0 []} {Name 001 26 []} {Name 002 28 []} &{zhangsan 25 [lisi wangwu]}
fmt.Println(&p1, "\n", &p2, "\n", &p3, "\n", &p4, "\n", &p5, "\n", &p6, "\n")
//0xc000006028 0xc000006030 0xc000006038 &{Name 001 26 []} &{Name 002 28 []} 0xc000006040
fmt.Println(*p1, "\n", *p2, "\n", *p3, "\n", *p6, "\n")
}
小结:
1、使用中如果包含数组,结构体的实例化需要加上类型如上如果Doc的类型是[]string。
2、实例化的时候可以初始化属性值,如果没有指明则默认为系统默认值。
3、加&符号和new的是指针对象,没有的则是值对象,这点和php、java不一致,在传递对象的时候要根据实际情况来决定是要传递指针还是值。
4、当对象比较小的时候传递指针并不划算。
6. Go常用算法
数据结构和算法(Golang实现)https://www.cnblogs.com/nima/p/12711150.html(https://goa.lenggirl.com/#/basic/before)
数据结构主要用来组织数据,也作为数据的容器,载体。各种各样的算法,都需要使用一定的数据结构来组织数据。
6.1 常见的典型数据结构有:链表,栈和队列,树,图
上述可以延伸出各种各样的术语和结构,如列表,集合,哈希表,堆,优先队列,二叉树,红黑树,B+树以及各种变种等。
6.2 算法目的就是为了解决问题,基本的算法分类有:排序算法,查找算法,图相关的算法,其他的算法
7.Go并发示例
交替打印数字和字母
问题描述:
使用两个 goroutine 交替打印序列,一个 goroutine 打印数字, 另外一个 goroutine 打印字母,
最终效果如下:12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728
解题思路:问题很简单,使用 channel 来控制打印的进度。使用两个 channel ,来分别控制数字和字母的打印序列, 数字打印完成后通过 channel 通知字母打印,
字母打印完成后通知数字打印,然后周而复始的工作。
源码参考
letter,number := make(chan bool),make(chan bool)
wait := sync.WaitGroup{}
go func() {
i := 1
for {
select {
case <-number:
fmt.Print(i)
i++
fmt.Print(i)
i++
letter <- true
}
}
}()
wait.Add(1)
go func(wait *sync.WaitGroup) {
i := 'A'
for{
select {
case <-letter:
if i >= 'Z' {
wait.Done()
return
}
fmt.Print(string(i))
i++
fmt.Print(string(i))
i++
number <- true
}
}
}(&wait)
number<-true
wait.Wait()
源码解析:
这里用到了两个channel负责通知,letter负责通知打印字母的goroutine来打印字母,number用来通知打印数字的goroutine打印数字。
wait用来等待字母打印完成后退出循环。
8. https://www.jianshu.com/p/c118d2de698e---使用golang的sort包进行排序
sort.Sort(OneList(oneArr))
Len() 函数 返回要排序的序列的长度
Less() 函数 返回排序需要的比较的规则,如果符合这个规则,就进行交换
Swap() 函数 进行排序的交换规则
Golang基础 一揽子方案相关推荐
- Golang题 一揽子方案
1.Go的XSS(跨站脚本攻击)的防护应该结合以下两种方式. 1.1 验证所有输入数据,有效检测攻击. 1.2 对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行. func HT ...
- golang基础-etcd介绍与使用、etcd存取值、etcd监测数据写入
关注公众号"风色年代"订阅更多精彩文章,本博大部分文章为转载并已标明原文出处,如有再转敬请保留,请自觉尊重原创作者的劳动成果! golang基础-etcd介绍与使用.etcd存取值 ...
- golang基础教程
目录 golang基础教程(一).环境搭建 golang基础教程(二).开发规范及API golang基础教程(三).变量与数据类型概述 golang基础教程(四).基本数据类型 golang基础教程 ...
- golang基础面试题总结
golang基础面试题总结 前言:由于正在准备之后的实习面试,故总结了一部分golang语言基础的问题,回答全为自己组织的语言,若有错各位大佬可及时指出,大家共同进步,谢谢. 1.go中怎样实现安全读 ...
- Go语言学习笔记—golang基础语法
视频来源:B站<golang入门到项目实战 [2022最新Go语言教程,没有废话,纯干货!]> 文章为自己整理的学习笔记,侵权即删,谢谢支持! 文章目录 golang基础语法 一.gola ...
- 土方回填施工方案范本_基础施工方案(土方开挖、回填、混凝土)
基础施工方案 该工程为广西第四地质队五一基地22#住宅楼工程.为了使基础工程有计划,有组织施工,在确保质量.节约成本和加快施工进度的基础上,按照设计要求和施工规范制定本方案. 一.基础工程概况: 本工 ...
- golang基础教程(十)、结构体
golang基础教程 一.Golang 语言面向对象编程说明 Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言.所以我们说 Golang 支持面向 ...
- 视频教程-桫哥-GOlang基础-01基本程序设计-Go语言
桫哥-GOlang基础-01基本程序设计 多年互联网从业经验: 有丰富的的企业网站.手游.APP开发经验: 曾担任上海益盟软件技术股份有限公司项目经理及产品经理: 参与项目有益盟私募工厂.睿妙影音家庭 ...
- Golang 基础之基础语法梳理 (一)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...
最新文章
- 临平职高计算机专业高职考大学,临平职高高考再传捷报 本科连续四年蝉联杭州市第一...
- wireshark安装
- 【pyQuery】抓取startup news首页
- eclipse项目迁移到Android Studio
- 计算机键盘正确指法操作方法,“认识键盘与正确的指法输入”教案
- 误删除了mysql库的user表解决办法
- 【Spark Summit EU 2016】沃森媒体分析系统:从单租户Hadoop到3000租户Spark的架构演进...
- VS远程Linux项目附加pthread
- tensorflow之variables_to_restore
- 惯导系统模型及其仿真(五)
- emWin使用(1)——LCD屏幕接口、LCD驱动芯片确定
- 什么是微内核,看这一篇就够了
- Android之提示Could not find com.android.support:appcompat-v7:25.3.1
- PADS-VX入门到精通实战项目讲解(上)—LOGIC部分-覃小刚-专题视频课程
- 新手小白怎样才能画好女生身体?画好女生身体有哪些技巧?
- 验证身份证号码是否有效
- phpcmsv9实现手机端与PC端双模板的方法与详细教程(转)
- WaitForSingleObject 返回值为 WAIT_ABANDONED 的情况
- 对secx,cscx积分的过程
- 输入10个数,将最大的数字输出;
热门文章
- hbuilder无法检测到安卓手机3.4.15
- 基于IQxel的WIFI RF测试指导书
- CUIT第七届智能小车(基础四轮电磁组)比赛总结
- CUIT Online Judge 最大值与最小值
- 开源OA:手把手教你搭建OA办公系统(12)O2OA与第三方系统的数据交互实现
- 关于发票的这些事儿,发票问题大汇总42个问题,15种发票不能抵扣
- 智能优化 | MATLAB实现CS-ANN布谷鸟优化人工神经网络算法
- 湖南大学计算机与通信学院研究生,湖南大学计算机与通信学院介绍
- javaSE常用类(二)—— 日期类
- 机器人硬汉 聆听_智能巡检机器人“上刀山下火海”冲锋陷阵成“硬汉”