【Go编程基础】08-map
map
类似其它语言中的哈希表或者字典,以key-value形式存储数据
Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍_ Map使用make()创建,支持 := 这种简写方式
make([keyType]valueType, cap),cap表示容量,可省略
超出容量时会自动扩容,但尽量提供一个合理的初始值
使用len()获取元素个数
键值对不存在时自动添加,使用delete()删除某键值对
使用 for range 对map和slice进行迭代操作
1234567891011func main() { m := make(map[int]string) m[1]="OK" a := m[1] fmt.Println(a) fmt.Println(m)}输出:OKmap[1:OK]
1234567891011121314151617181920212223func main() { ...
【Go编程基础】07-切片slice
切片Slice
其本身并不是数组,它指向底层的数组
作为变长数组的替代方案,可以关联底层数组的局部或全部
为引用类型
可以直接创建或从底层数组获取生成
使用len()获取元素个数,cap()获取容量
一般使用make()创建
如果多个slice指向相同底层数组,其中一个的值改变会影响全部
make([]T, len, cap)
其中cap可以省略,则和len的值相同
len表示存数的元素个数,cap表示容量
1234567891011121314151617181920212223242526272829func main() { var s1 []int fmt.Println(s1) a := [10]int{1,2,3,4,5,6,7,8,9,10} s2 := a[9] fmt.Println(s2) s3 := a[5:10] fmt.Println(s3) // 获取数组某个位置开始到结束 s4 := a[3:len(a)] s5 := a[3:] fmt.Println(s4) fmt.Println(s5) // 获取 ...
【Go编程基础】06-数组array
数组Array
定义数组的格式:var [n],n>=0
数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
注意区分指向数组的指针和指针数组
数组在Go中为值类型
数组之间可以使用==或!=进行比较,但不可以使用<或>
可以使用new来创建数组,此方法返回一个指向数组的指针
Go支持多维数组
12345678910111213// 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型var a [3]intvar b [2]intb = a// 上面的赋值语句会报错:cannot use a (variable of type [3]int) as type [2]int in assignment// 下面的语句就能正常赋值成功var a [2]intvar b [2]intb = afmt.Println(b)输出:[0 0]
12345678910111213141516171819202122232425262728293031323334353637383940414243444546func m ...
【Go编程基础】05-控制语句
指针
Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不支持指针运算以及”->”运算符,而直接采用”.”选择符来操作指针 目标对象的成员
操作符”&”取变量地址,使用”*”通过指针间接访问目标对象
默认值为 nil 而非 NULL
递增递减语句
在Go当中,++ 与 – 是作为语句而并不是作为表达式
判断语句if
条件表达式没有括号
支持一个初始化表达式(可以是并行方式)
左大括号必须和条件语句或else在同一行
支持单行模式
初始化语句中的变量为block级别,同时隐藏外部同名变量
1234567891011121314func main() { a := true if a, b, c := 2, 3, 4; a+b+c > 6 { fmt.Println("大于6") } else { fmt.Println("小于6") } fmt.Println(a)}输出:大于6true
循环语句for
Go只有for一个循环语句关键字,但支持3种形 ...
【Go编程基础】04-常量与运算符
常量的定义
常量的值在编译时就已经确定
常量的定义格式与变量基本相同
等号右侧必须是常量或者常量表达式
常量表达式中的函数必须是内置函数
123456789101112131415161718192021222324252627package mainimport "fmt"// 定义单个常量const a int = 1const b = 'B'const ( text = "123" length = len(text) num = b * 20)// 同时定义多个变量const i, j, k = 1, "2", '3'const ( text2, length2, num2 = "468", len(text2), k * 10)func main() { fmt.Println(a, b, text, length, num) fmt.Println(i, j, k, text2, length2, num2)}输出:1 66 ...
【Go编程基础】03-类型与变量
Go基本类型布尔型:bool
长度:1字节
取值范围:true, false
注意事项:不可以用数字代表true或false
整型:int/uint
根据运行平台可能为32或64位
8位整型:int8/uint8
长度:1字节
取值范围:-128127/0255
字节型:byte(uint8别名)
16位整型:int16/uint16
长度:2字节
取值范围:-3276832767/065535
32位整型:int32(rune)/uint32
长度:4字节
取值范围:-2^32/22^32/2-1/02^32-1
64位整型:int64/uint64
长度:8字节
取值范围:-2^64/22^64/2-1/02^64-1
浮点型:float32/float64
长度:4/8字节
小数位:精确到7/15小数位
复数:complex64/complex128
长度:8/16字节足够 ...
通过MySQL自带函数st_distance计算两个经纬度点的距离(效率更优)
情况一
数据库:有point类型的location字段实体类:有经纬度字段(double)
1234567891011121314select regionId, provinceName, cityName, districtName, lon, lat, (st_distance (location,point(31.0, 103.0) ) / 0.0111) AS distance FROM t_region WHERE 1=1 AND deleted = 0 order by distance asc
情况二
数据库:有经度纬度字段,但是没有point字段实体类:有经纬度字段(double)
1234567891011121314select regionId, provinceName, cityName, districtName, lon, lat, (st_distance (point(lon, lat),point(31.0, 103.0) ) / 0.0111) AS distance FROM t_region ...
CloudFlare Workers更换(workers.dev)默认域名的解决方案
最近由于CloudFlare Workers的默认域名(workers.dev)不能访问了。这对于使用CloudFlare Workers服务的应用带来了不便。今天这篇教程就和大家一起解决这个问题。
准备材料
一个域名(可不用备案)
一个目前运行正常的Worker
配置步骤1、登录CloudFlare,点击右上角的添加站点,获取域名托管在CloudFlare上的名字服务器。
2、登录域名服务商,不同的服务商配置不一样,我的域名是在 dynadot 上购买的,可以使用我的推荐码:pc7M9F6O8Zh6w,在控制台配置域名名字服务器,指向上一步CloudFlare的名字服务器,配置完成后需要等待一段时间才能生效,生效之后会收到CloudFlare发送的生效通知邮件。
3、进入刚才添加的站点,添加一条A记录的域名,指向IP可以随意填,我这里填的是8.8.8.8,注意代理状态一定要开启(开启小云朵)。
4、点击左侧菜单下的Workers->添加路由->输入自己域名的路由(路由需要提供这种形式:*.xxx.com/*),在下拉框中选择自己的worker服务和环境。 ...
【Go编程基础】02-Go基础知识
Go内置关键字(25个均为小写)
break
default
func
interface
select
case
defer
go
map
struct
chan
else
goto
package
switch
const
fallthrough
if
range
type
continue
for
import
return
var
Go注释方法
// 单行注释
/* */ 多行注释
代码组织结构
Go程序是通过 package 来组织的(与python类似)
只有 package 名称为 main 的包可以包含 main 函数
一个可执行程序 有且仅有 一个 main 包
通过 import 关键字来导入其它非 main 包
通过 const 关键字来进行常量的定义
通过在函数体外部使用 var 关键字来进行全局变量的声明与赋值
通过 type 关键字来进行结构( struct )或接口( interface )的声明
通过 **func 关键字来进行函数的声明
Go导入 packag ...
【Go编程基础】01-Go开发环境搭建
什么是Go?Go是一门并发支持 、垃圾回收的编译型 系统编程语言,旨在创造一门具有在静态编译语言的 高性能 和动态语言的 高效开发 之间拥有良好平衡点的一门编程语言。
Go的主要特点有哪些?
类型安全和内存安全
以非常直观和极低代价的方案实现高并发
高效的垃圾回收机制
快速编译(同时解决C语言中头文件太多的问题)
为多核计算机提供性能提升的方案
UTF-8编码支持
Go存在的价值是什么?Go在谷歌:以软件工程为目的的语言设计
Go是记事本编程吗?包括GoLand,VSCode,LiteIDE等众多知名IDE均已支持
Go目前有多少实际应用和资源?
全球最大视频网站 Youtube(谷歌)
七牛云储存以及旗下网盘服务(Q盘)
爱好者开发的Go论坛及博客
已用Go开发服务端的著名企业:谷歌、盛大、七牛、360
Go发展成熟了吗?作为一门2009年才正式发布的编程语言,Go是非常年轻的,因此不能称为一门成熟的编程语言,但开发社区每天都在不断更新其核心代码,给我们这些爱好者给予了很大的学习和开发动力。
Go的爱好者多吗?以Google Group为主的邮件列表每天都会更新10至20帖,国内 ...