Go语言的基础知识

1, Go 语言介绍
Go 即 Golang,是 Google公司2009年11月正式对外公开的一门编程语言。
根据 Go 语言开发者自述,近10多年,从单机时代的C语言到现在互联网时代的Java,都没有令人满意的开发语言,而C++往往给人的感觉是,花了100%的经历,却只有60%的开发率,产出比太低,Java和C#的哲学又来源于C++。并且,随着硬件的不断升级,这些语言不能充分的利用硬件及CPU。因此,一门高效,简洁,开源的语言诞生了。
GO语言不仅拥有静态编译语言的安全和高性能,而且又达到了动态语言开发速度和易维护性。有人形容Go语言:Go=C+Python,说明Go语言即有C语言程序的运行速度,又能达到Python语言的快速开发。
Go语言是非常有潜力的语言,是因为它的应用场景是目前互联网热门的几个领域,比如WEB开发,区块链开发,大型游戏服务端的开发,分布式/云计算开发。国内比较知名的
B站就是用Go语言开发的,像 Google,阿里,京东,百度,腾讯,小米,360d的很多应用也是使用Go语言开发的。
2,Go语言成功的项目
nsq: bitly开源的消息队列系统,性能非常高,目前他们每台处理数十亿条的消息。
docker: 基于lxc的一个虚拟打包工具,能够实现PAAS平台的组件
packer: 用来生成不同平台的镜像文件,例如VM,vbox,AWS等,作者是vagrant的作者
skynet: 分布式调度框架
Doozer:分布式同步工具,类似ZooKeeper
Heka: mazila 开源的日志处理系统
cbfs: couchbase 开源的分布式文件系统
tsuru: 开源的 PAAS 平台,和 SAE 实现的功能一模一样
groupcache: memcache 作者写的用于Google下载系统的缓存系统
god: 类似 redis 的缓存系统,但是支持分布式和扩展性
gor: 网络流量抓包和重放工具
3,哪些大公司在用 go 语言?
Google
这个不用多做介绍,作为开发Go语言的公司。当仁不让。Google基于Go有很多优秀的项目,比如: https://github.com/kubernetes/kubernetes,大家也可以在Github上 https://github.com/google/查看更多Google的Go开源项目。
Facebook
Facebook也有在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过 https://github.com/facebookgo 访问查看 facebook 开源的项目,比如著名的是平滑升级的grace.
腾讯
腾讯作为国内的大公司。还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了 docker 万台规模的实践,具体可以参考 http://www.infoq.com/cn/articles/tenent-millions-scale-docker-application-practice

百度
目前所知的百度的使用 是在运维这边,是百度运维的一个BFE下项目。负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个

http://www.info.com/cn/presentations/application-of-golang-in-baidu-frontend

京东
京东云消息推送系统,云存储,以及京东商城等都要使用Go做开发。

小米
小米对Golang的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/
此外。小米互娱,小米商城,小米视频,小米生态链等团队都在使用Golang.

360
360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon
4,Go语言前景
5,Go环境 win 环境搭建
1,下载安装 Golang
Go官方下载地址: https://golang.org/dl/
Go官方镜像站(推荐): https://golang.google.cn/dl/2, 安装软件
双击下一步下一步进行安装3, 验证有没有安装成功
go versiongo version go1.23.3 windows/amd644, 查看 go 环境
go env C:\Users\Administrator>go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=F:\Users\AppData\Local\Programs\Microsoft VS Code\bin
set GOCACHE=G:\Users\AppData\Local\go-build
set GOENV=G:\Users\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=G:\Users\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=G:\Users\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=F:\Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLCHAIN=auto
set GOTOOLDIR=F:\Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.23.3
set GODEBUG=
set GOTELEMETRY=local
set GOTELEMETRYDIR=G:\Users\AppData\Roaming\go\telemetry
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=0
set GOMOD=NUL
set GOWORK=
set CGO_CFLAGS=-O2 -g
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-O2 -g
set CGO_FFLAGS=-O2 -g
set CGO_LDFLAGS=-O2 -g
set PKG_CONFIG=pkg-config
说明: Go1.11版本之后无需手动配置环境变量,使用 go mod 管理项目,也不需要非得把项目放到 GOPATH指定目录下,你可以在你磁盘的任何位置心建一个项目。
Go1.13以后可以彻底不要 GOPATH了。

6 , Go 语言开发工具 Vscode配置

1, 下载安装 vscode
https://code.visualstudio.com/
2, 汉化 vscode
3,vscode中安装Go语言插件

3, Go语言 vscode 插件安装失败解决方法
go env -w GOPROXY=https://goproxy.io
4,LiteIDE安装
LiteIDE是一款简单,开源,跨平台的 GoIDE
官网:
官网:
http://liteide.org/cn
发行版下载地址:
https://sourceforge.net/projects/liteide/files
合作网站: www.itying.com(IT营)
作者专栏:
https://www.itying.com/category-79-b0.html
5,Go语言 定义变量 ,fmt包,Print,Println,Printf,Go语言注释
import "fmt"
fmt包里面给我们提供了一些常见的打印数据的方法,比如:Print,Println,Printf,在我们实际开发中Println,Printf用的非常多。
Print和Println区别:
一次输入多个值的时候Println中间有空格Print没有
fmt.Println("go","python"."php","javascript")//go python php javascript
fmt.Print("go","python","php","javascript")//gopythonphpjavascript
Print会自动换行,Prrint不会
package mainimport "fmt"func main() {/*fmt.Println("您好,欢迎来到Go语言编程课堂!")fmt.Print("Hello,Go!")*/// fmt.Printf("Hello,Go!\n")// Print与Println的区别:Print会输出空格,Println不会输出空格// fmt.Println("您好,欢迎来到Go语言编程课堂!")// fmt.Print("Hello,Go!")// fmt.Println("A")// fmt.Println("B")// fmt.Println("C")// fmt.Print("D")// fmt.Print("E")// fmt.Print("F")// fmt.Printf("G")// fmt.Printf("H")// fmt.Printf("K")// fmt.Print("A", "B", "C")// fmt.Println("A", "B", "C")fmt.Printf("A", "B", "C")
}PS D:\Program Files\Go\src\project\go_demo\demo02> go run main.go
A
B
C
DEFGHK
Println和Printf区别
Printf是格式化输出,在很多场景下比Println更方便,举个例子:
  a := 10b := 20c := 30fmt.Println("a=", a, ",b=", b, ",c=", c)//%d 打印变量a,b,c的值 a= 10 ,b= 20 ,c= 30fmt.Printf("a=%d,b=%d,c=%d", a, b, c)//a=10,b=20,c=30

1,Go语言定义变量

这里我们为了演示代码期间给大家先简单介绍一下变量,后面的教程还会详细讲解。
关于变量:程序运行过程中的数据都是保存在内存中,我们想要在代码中操作某个数据时就需要去内存上找到这个变量,但是如果我们直接在代码中通过内存地址去操作变量的话,代码的可读性会非常差而且还容易出错,所以我们就利用变量将这个数据的内存地址保存起来,以后直接通过这个变量就能找 到内存上对应的数据了。
Golang中常见的变量定义方法如下:
Golang 中常见的变量定义方法如下:
1,var 定义变量
var 变量名 类型=表达式
var name string="zhangsan"
2, 类型推导方式定义变量
a 在函数内部,可以使用更简略的 := 方式声明并初始化变量。
注意:短变量只能用于声明局部变量,不能用于全局变量的声明
变量名 := 表达式a := 10b := 20c := 30fmt.Println("a=", a, ",b=", b, ",c=", c)//%d 打印变量a,b,c的值 a= 10 ,b= 20 ,c= 30fmt.Printf("a=%d,b=%d,c=%d", a, b, c)//a=10,b=20,c=30
​
%d 是占位符,表示数字的十进制表示。Printf中的占位符与后面的数字变量一一对应。
更多的占位符参考:
http://docscn.studygolang.com/pkg/fmt/
3,Go语言中的注释
win下面 ctrl+/可以快速的注释一行,mac下面 command+/也可以快速的注释一行。
/*这是一个多行注释这是一个多行注释
*/
​
// 这是一个单行注释
Go 变量,常量,变量命名规则

1,变量的来历

2,变量的类型

3,Go语言中变量的声明

4,Go语言中的常量

5,Go语言变量,常量命名规则

6,Go语言代码风格

1,变量的来历
程序运行过程中的数据都是保存在内存中,我们想要在代码中操作某个数据时就需要去内存上找到这个变量,但是如果我们直接在代码中通过内存地址去操作变量的话,代码的可读性会非常差而且还容易出错,所以我们就利用变量将这个数据的内存地址保存起来,以后直接通过这个变量就能找到内存上对应的数据了。
2,变量类型
变量(Variable)的功能是存储数据。不同的变量保存的数据类型可能会不一样。经过半个多世纪的发展,编程语言已经基本形成了一套固定的类型,常见变量的数据类型有:整型,浮点型,布尔型等。
Go语言中的每一个变量都要自己的类型,并且变量必须经过声明才能开始使用。
3,GO语言中变量的声明
Go语言变量名由字母,数字,下划线组成,其中首个字符不能为数字。Go语言中关键字和保留字都不能用作变量名。
Go语言中的变量需要声明后才能使用,同一作用域内部不支持重复声明。并且Go语言的变量声明后必须使用。
1,var 声明变量
var 变量名称 type
​
var name string
var age int
var isOK bool

举例:

package mainimport "fmt"func main() {// fmt.Println("变量声明: var 变量名 类型 = 表达式")// 	var username string// 	fmt.Println(username)// 变量声明后没有赋值,默认值为变量类型的零值 即变量为空值// var username string = "张三"// fmt.Println(username)// var 1a stringconst	// 错误 变量名不能以数字开头// fmt.Printf("", var)// var m_ = "李四"	// 正确 变量名可以以下划线开头 不推荐使用// fmt.Println(m_)// var if = "李四"	// 错误 变量名不能使用关键字// fmt.Println(if)// go语言 变量的定义以及初始化值必须使用同一个类型// 第一种初始化变量的方式:// var username string// username = "李四"// fmt.Println(username)// 第二种初始化变量的方式:var 变量名 类型 = 值// var username string = "张三" // 推荐使用// fmt.Println(username)// 第三种初始化变量的方式:变量名 := 值	// 自动推导变量类型 使用简短赋值语句 :=// username := "王五"// fmt.Println(username)// 第四种初始化变量的方式:同时声明多个变量// var username = "李四"// var age = 18// var sex = "男"// fmt.Println(username, age, sex)var username = "李四"var age = 18var sex = "男"username = "张三" // 变量可以重新赋值fmt.Println(username, age, sex)}https://github.com/PublicSuffixList
https://publicsuffix.org/
2, 一次定义多个变量
var identifier1,identifier2 typepackage main
import "fmt"
func main() {var username,sex string
}
3,批量声明变量的时候指定类型
var(a stringb intc bool
)
a = "zhangsan"
b = 20
c = true
fmt.Println(a,b,c)
4, 变量的初始化
Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值。例如: 整型和浮点型变量的默认值为0。字符串变量的默认值为空字符串。布尔型变量默认值为 false,切片,函数,指针变量的默认值为 nil。
当然我们也可在声明变量的时候为其指定初始值。变量初始化的标准格式如下:
var 变量名 类型 = 表达式
举个例子:
var name string = "zhangsan"
5, 类型推导
有时候我们会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化
var name = "Q1mi"
var age = 18
6,短变量声明法
在函数内部,可以使用更简略的 := 方式声明并初始化变量。
注意:短变量只能用于声明局部变量,不能用于全局变量的声明
变量名 := 表达式package main
import "fmt"// 全局变量
var m = 100func main() {n := 10m := 200 // 此处声明局部变量 mfmt.Print(m,n)
}
7,匿名变量
在使用多重赋值时,如果想要忽略某个值,可以使用匿名变量(anonymous variable).匿名变量用一个下划线 _ 表示。例如:
func getInfo() (int,stringi) {return 10,"张三"
}
实战如下:
package mainimport "fmt"// 封装一个方法(函数)
func getUserinfo() (string, int) {return "张三", 18
}// var g = "全局变量"// g1 := "全局变量 短变量声明法式 错误写法"func main() {// g1 := "全局变量 短变量声明法式 错误写法"// fmt.Println(g)// fmt.Println(g1) // 全局变量 短变量声明法式 错误写法// fmt.Println("变量声明: var 变量名 类型 = 表达式")// 	var username string// 	fmt.Println(username)// 变量声明后没有赋值,默认值为变量类型的零值 即变量为空值// var username string = "张三"// fmt.Println(username)// var 1a stringconst	// 错误 变量名不能以数字开头// fmt.Printf("", var)// var m_ = "李四"	// 正确 变量名可以以下划线开头 不推荐使用// fmt.Println(m_)// var if = "李四"	// 错误 变量名不能使用关键字// fmt.Println(if)// go语言 变量的定义以及初始化值必须使用同一个类型// 第一种初始化变量的方式:// var username string// username = "李四"// fmt.Println(username)// 第二种初始化变量的方式:var 变量名 类型 = 值// var username string = "张三" // 推荐使用// fmt.Println(username)// 第三种初始化变量的方式:变量名 := 值	// 自动推导变量类型 使用简短赋值语句 :=// username := "王五"// fmt.Println(username)// 第四种初始化变量的方式:同时声明多个变量// var username = "李四"// var age = 18// var sex = "男"// fmt.Println(username, age, sex)// var username = "李四"// var age = 18// var sex = "男"// username = "张三" // 变量可以重新赋值// fmt.Println(username, age, sex)// 第五种初始化变量的方式:简短声明 := 变量值	// 只能在函数中定义局部变量// 一次声明多个变量/*1,一次定义多个变量 类型一致的变量var 变量名称,变量名称,变量名称 类型 = 变量值,变量值,变量值var (变量名称 类型变量名称 类型变量名称 类型)*/// 一次定义多个变量// var a1, a2 string// a1 = "aaa"// a2 = "aaaaaaaa"// fmt.Println(a1, a2) // aaa aaaaaaaaa//2,定义多个变量时,类型可以不同/*var (username stringage      intsex      string)username = "张三"age = 18sex = "男"fmt.Println(username, age, sex)*/// 3,一次定义多个变量时,类型可以不同// var (// 	username string = "张三"// 	age      int    = 18// 	sex      string = "男"// )// fmt.Println(username, age, sex)// 4,定义多个变量时,类型可以不同// 简短声明 = 变量值   只能定义全局变量 不能定义局部变量// var (// 	username = "李四"// 	age      = 18// 	sex      = "男"// )// fmt.Println(username, age, sex)// fmt.Println("=========================")/*5,短变量声明法,在函数内部,可以使用更简略的 := 方式声明并初始化变量。注意:短变量只能用于声明局部变量,不能用于全局变量的声明*/// username := "王五"// fmt.Println(username)// // 打印 username 变量的类型// fmt.Printf("username 的类型是 %T\n", username)// fmt.Printf("类型:%T\n", 10)// 6,使用短变量一次声明多个变量,并初始化变量值// a, b, c := 12, 13, 20// fmt.Println(a, b, c)// 12 13 20// 7,使用短变量一次声明多个变量,类型可以不同// a, b, c := 12, 13, "c"// fmt.Println(a, b, c)                                   // 12 13 c// fmt.Printf("a 的类型: %T, b 的类型: %T, c 的类型: %T", a, b, c) // a 的类型: int, b 的类型: int, c 的类型: string/*匿名变量:在使用多重赋值时,如果想忽略某个值,可以使用匿名变量。(anonymous variable)匿名变量用户定义一个没有变量名的变量。匿名变量用 _ 符号表示,比如:func getUserinfo() (string, int) {return "张三", 18}*/// var username, age = getUserinfo()// fmt.Println(username, age) // 张三 18  能打印出来,表示我们可以调用getUserinfo()这个方法// 8,使用匿名变量忽略返回值// var username = getUserinfo()// fmt.Println(username) // 张三  报错// var username, _ = getUserinfo()// fmt.Println(username) // 张三// 9,匿名变量不占命名空间,不会分配内存,所以匿名变量之间不存在重复声明的问题var _, age = getUserinfo()fmt.Println(age) // 18
}

4,Go 语言中的常量

相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。常量的声明和变量的声明非常类似,只是把var换成了 const,常量在定义的时候必须赋值。
1,使用 const 定义常量
const pi = 3.1415
const e = 2.7182
声明了pi和e这两个常量之后,在整个程序运行期间™的值都不能再发生变化了。
多个常量也可以一起声明:
const(pi = 3.14159e = 2.7182
)
const同时声明多个常量时,如果省略了值则表示和上面一行的值相同,例如:
const(n1 = 100n2n3
)
打印 pi 的值
package main
import("fmt""math"
)
func main() {const pi=math.pifmt.Println(pi)
}
2, const 常量结合 iota 的使用 (了解)
iota 是 golang 语言的常量计数器,只能在常量的表达式中使用。
iota 在 const 关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使 iota 计数一次(iota 可理解为const 语句块中的行索引)。
1),iota 只能在常量的表达式中使用。
fmt.Println(iota)
编译错误:undefined:iota
2) , 每次 const 出现时,都会让 iota 初始化为 0.【自增长】
const a = iota //a=0
const(b = iota //b=0c		 //c=1
)
3)const iota使用_跳过某些值。
const(n1 = iota //0n2-n4
)
fmt.Println(n1,n2,n4) 0 1 3
4) iota 声明中间插队
const(n1 = iotan2 = 100n3 = iotan4
)
const n5 = iota
fmt.Println(n1,n2,n3,n4,n5)//0 100 2 3
5) 多个 iota 定义在一行
const(a,b = iota + 1,iota + 2 // 1,2c,de,f
)
fmt.Println(a,b c,d e,f)
5, Go 语言变量,常量命名规则
1,变量名称必须由数字,字母,下划线组成。
2,标识符开头不能是数字
3,标识符不能是保留字和关键字。
4,变量的名字是区分大小写的如:age和Age是不同的变量,在实际的运用中,也建议不要用一个单词大小写区分两个变量。
5,标识符(变量名称)一定要见名思意:变量名称建议用名词,方法名称建议用动词
6,变量命名一般采用驼峰式,当遇到特有名词(缩写或简称,如DNS)的时候,特有名词根据是否私钥全部大写或小写。
6,Go语言代码风格
1,代码每一行结束后不用写分号(;)
2, 运算符左右建议个加一个空格
var username string = "itying"
3, Go语言程序员推荐使用驼峰式命名
当名字有几个单词组成的时候优先使用大小写分隔
4,强制的代码风格
左括号必须紧接着语句不换行,这个特性刚开始会使开发者不习惯,但随着对GO语言的不断熟悉,就会发现风格统一让大家在阅读代码时把注意力集中到了解决问题上,而不是代码风格上
5, go fmt 主要用于格式化文档,让所有人的代码风格保存一
go fmt main.go
main.go
实践
package mainimport ("fmt""math"
)// const iota = 10func main() {const pi = math.Pifmt.Println(pi)// 变量声明以后,可以多次赋值,但是不可以重复声明同一个变量// var username = "张三"// username = "李四"// username = "王五"// fmt.Println(username)// 1 . 常量声明:const 变量名 = 值// 常量声明以后,不可以重复赋值 const pi = 3.14// const pi = 3.1415926// fmt.Println(pi)// 变量声明和常量声明的区别:// 1.变量声明后,可以多次赋值;常量声明后,不可以重复赋值// 2.变量声明后,如果不赋值,则系统默认值为0值,例如int为0,string为空字符串""// 3.变量声明后,如果不赋值,则不能直接使用// 变量声明和常量声明的选择:// 1.如果需要被多次赋值,则使用变量;如果只使用一次,则使用常量// var num int = 10// fmt.Println(num)// const num2 = 10// fmt.Println(num2)// fmt.Println(num + num2)// 2. 一次可以声明多个常量,也可以同时声明多个不同类型的常量,例如:// const (// 	A = "A"// 	B = "B"// )// fmt.Println(A, B)// 3. const 同时声明多个常量,如果省略了值,则表示和上面一行声明的常量值相同,例如:// const (// 	n1 = 100// 	n2// 	n3// )// fmt.Println(n1, n2, n3) // 100 100 100/* 1. 常量声明中,如果需要使用到某个常量表达式中的值,则必须将该常量表达式写在一行中,例如:iota 是 golang 语言的常量计数器,只能在常量的表达式中使用。iota 在 const 关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使 iota 计数一次(iota 可理解为const 语句块中的行索引)。每次 const 出现时,都会让 iota 初始化为 0.【自增长】iota 主要用在一次定义常量组时,不需要写各组的值*/// const a = iota // a=0// const (// 	b = iota // b=0// 	c// 	d// )// fmt.Println(a)// fmt.Println(a, b, c, d) // 0 0 1 2// fmt.Println(iota)//2,每次 const 出现时,都会让 iota 初始化为 0.【自增长】// const (// 	n1 = iota // n1=0// 	n2// 	n3// 	n4// 	n5// )// fmt.Println(n1, n2, n3, n4, n5) // 0 1 2 3 4// 3, const  iota使用_跳过某些值。// const (// 	n1 = iota// 	_// 	n3// 	n4// )// fmt.Println(n1, n3, n4) // 0 2 3// 4) iota 声明中间插队// const (// 	n1 = iota// 	n2 = 100// 	n3 = iota// 	n4// )// fmt.Println(n1, n2, n3, n4) // 0 100 2 3// 5)  多个 iota 定义在一行// const (// 	a, b = iota + 1, iota + 2 // a=1,b=2// 	c, d                      // c=2,d=3// 	e, f                      // e=3,f=4// )// fmt.Println(a, b, c, d, e, f) // 1 2 2 3 3 4// fmt.Println(a, b)// 1 2// fmt.Println(c, d)// 2 3// fmt.Println(e, f)// 3 4//Go语言中,变量和常量命名规范://1. 变量名必须以字母或下划线开头,大小写敏感//2. 变量名不能以数字开头,例如:age10//3. 变量名不能包含空格,例如:a b c//4. 变量名不能包含关键字,例如:var、const//5. 变量名不能包含特殊字符,例如:$、&等//6. 变量名要具有描述性,例如:username、password//7. 变量名要使用驼峰命名法,例如:UserName、Password//8. 变量名不要使用中文,例如:用户名、密码//9. 变量名不要使用拼音,例如:zhangsan、lisi//10. 变量名不要使用拼音和中文组合,例如:zhangSan、LiSi//11. 变量名要使用统一风格,例如:username、User_Name//12. 变量名不要过长,例如:user_name_of_good_friend//13. 变量名不要使用拼音缩写,例如:u、p//14. 变量名不要使用中文缩写,例如:u、p//15. 变量名不要使用数字,例如:user1、user2//16. 变量名不要使用下划线_,例如:user_name、password//17. 建议常量名全大写,例如:AGE、PASSWORD//18. 常量名不要使用中文,例如:年龄、密码// var age = 10// var Age = 20// fmt.Println(age, Age)// 在Go语言中,如果你将变量名封装成一个包,则变量名必须使用驼峰命名法// 小驼峰封装 私有 大驼峰封装 公有var maxAge = 10 // maxAge=10 小驼峰命名法	封装 私有var MaxAge = 20 // MaxAge=20 大驼峰命名法   封装 公有fmt.Println(maxAge, MaxAge)// go语言中代码风格:// 1. 使用tab缩进,不要使用空格// 2. 每行代码的长度不要超过150个字符// 3. 每行代码后面不要添加多余的空格// 4. 每行代码结束不要添加多余的;// 5. 代码块中,左括号{的位置通常放在函数名或者控制语句的末尾处,而不是开头// 6. 如果代码块中只有一行代码,则左括号{和右括号}可以写在同一行// 7. 不要使用多余的空行来缩进和分隔代码块// 8. 如果代码过长,可以使用换行来分隔// 9. 如果代码过长,可以使用括号()来分隔// 10. 如果代码过长,可以使用中括号[]来分隔// 11. 如果代码过长,可以使用花括号{}来分隔// 12. 如果代码过长,可以使用竖线|来分隔// 13. 如果代码过长,可以使用逗号,来分隔// 14. 如果代码过长,可以使用分号;来分隔// 15. 如果代码过长,可以使用空格来分隔// 16. 运算符前后要添加空格,例如:a = b + c// 17. 推荐使用单行注释,不要使用多行注释// 18. 推荐使用函数注释,不要使用包注释// 19. 推荐使用变量注释,不要使用常量注释// 20. 推荐使用结构体注释,不要使用接口注释// 21. 推荐使用方法注释,不要使用字段注释// 22. 注释内容应该使用完整句子,句子的开头第一个字母应该大写// 23. 注释内容应该使用英文,不要使用中文// 24. 注释内容应该使用英文句号,不要使用中文句号// 25. 注释内容应该使用英文感叹号,不要使用中文感叹号// 26. 注释内容应该使用英文问号,不要使用中文问号// 27. 注释内容应该使用英文逗号,不要使用中文逗号// 28. 注释内容应该使用英文分号,不要使用中文分号// 29. 注释内容应该使用英文冒号,不要使用中文冒号// 30. 注释内容应该使用英文省略号,不要使用中文省略号// 31. 注释内容应该使用英文双引号,不要使用中文双引号// 32. 注释内容应该使用英文单引号,不要使用中文单引号// 33. 注释内容应该使用英文括号,不要使用中文括号// 34. 注释内容应该使用英文反引号,不要使用中文反引号// 35. 注释内容应该使用英文中划线,不要使用中文中划线// 36. 注释内容应该使用英文等号,不要使用中文等号// 37. 注释内容应该使用英文加号,不要使用中文加号// 38. 注释内容应该使用英文减号,不要使用中文减号// 39. 注释内容应该使用英文星号,不要使用中文星号// 40. 注释内容应该使用英文斜线,不要使用中文斜线// 41. 注释内容应该使用英文反斜线,不要使用中文反斜线// 42. 注释内容应该使用英文点号,不要使用中文点号// 43. 推荐使用驼峰命名法,不要使用下划线_// 44. 当变量名、函数名、方法名等使用英文命名时,应该使用驼峰命名法// 45. 当常量名等使用英文命名时,应该使用全大写字母命名// 46. 当包名等使用英文命名时,应该使用小写字母命名// 47. 当接口名等使用英文命名时,应该使用驼峰命名法// 48. 当结构体名等使用英文命名时,应该使用驼峰命名法// 49. 当方法名等使用英文命名时,应该使用驼峰命名法// 50. 当字段名等使用英文命名时,应该使用驼峰命名法
}

Go 语言基本数据类型

1,Golang 数据类型介绍

2,整型

3,浮点型

4,布尔值

5,字符串

6,byte 和 rune 类型

7,修改字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE5 C++课程系列笔记】20——共享指针的简单使用

目录 概念 创建共享指针示例 重设共享指针 共享指针内容转移 共享指针和共享引用的转换 判断共享指针的相等性 共享指针访问成员函数 自定义删除器 概念 共享指针(主要以 TSharedPtr 为例),TSharedPtr 基于引用计数机制来工作&#x…

flux中的缓存

1. cache,onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存,但是当下游消费者的处理速度比上游生产者慢时,上游生产的数据会被暂时存储在缓冲区中,防止丢失。 2. Flux.range 默认…

Ubuntu网络连接问题(笔记本更换wifi后,虚拟机连不上网络)

1、笔记本更换wifi后,虚拟机的IP地址变了,然后就连不上网络了(主机笔记本连接wifi正常上网) 2、修改子网地址(按照ubutun的ip设置子网掩码) 3、Ubuntu已经显示网络连接正常了,但是就是无法上网&…

如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程

简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库,旨在处理跨多个普通服务器的大量数据,并提供高可用性,没有单点故障。Apache Cassandra 是一个高度可扩展的分布…

Spring MVC实战指南:构建高效Web应用的架构与技巧(三)

响应数据和结果视图(7种) 返回值分类 创建web.xml&#xff08;spring、过滤器解决乱码、配置控制器dispatcherServlet、加载springmvc.xml文件、配置启动加载&#xff09;创建springmvc.xml文件 <!--配置了内容&#xff0c;启动Tomcat服务器的时候&#xff0c;就会被加载--…

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…

Linux下编译安装PETSc

本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…

深入Android架构(从线程到AIDL)_11 线程之间的通信架构

目录 5、 线程之间的通信架构 认识Looper与Handler对象 主线程丢信息给自己 子线程丢信息给主线程 替子线程诞生Looper与MQ 5、 线程之间的通信架构 认识Looper与Handler对象 当主线程诞生时&#xff0c;就会去执行一个代码循环(Looper)&#xff0c;以便持续监视它的信息…

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…

2024年, Milvus 社区的那些事

随着跨年钟声响起&#xff0c;2024 年告一段落。这一年&#xff0c;Milvus GitHub Stars 正式突破 3 万大关&#xff0c;Docker 下载量突破6700w 次&#xff0c;达到一个新的里程碑&#xff0c;在开源向量数据库领域继续引领前行。在这遥遥领先的数据背后&#xff0c;不妨让我们…

docker中使用Volume完成数据共享

情景概述 在一个docker中&#xff0c;部署两个MySQL容器&#xff0c;假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题&#xff1a; 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后&#xff0c;数据就会丢失。 基于以上问题&#xff0c;容…

【期末复习】二、进程管理

1.进程的内存结构🍊 程序加载到内存之后就变成了一个进程,进程在内存当中的一个结构有: 文本段(text section):存放程序代码 栈(stack):存放局部变量和函数返回地址 数据段(data section):存放全局变量和静态变量(static) 堆(heap):程序运行时的动态内存分…

Type-C多口适配器:高效充电与连接解决方案

在科技飞速发展的今天&#xff0c;我们的生活已经离不开各种各样的电子设备&#xff0c;如智能手机、平板电脑、智能手表和无线耳机等。这些设备不仅丰富了我们的数字生活&#xff0c;也带来了更多的充电需求。传统的单一充电口已经难以满足现代人对于便捷性和效率的追求&#…

UCAS 24秋网络认证技术 CH10 SSL 复习

TLS字段、参数含义要了解每个消息是什么意思 基本方式只验证服务端&#xff0c;服务端有证书&#xff0c;变形方式加上验证客户端TLS1.3区别 协商过程 背景 Record层使用的各种加密算法参数&#xff0c;均由Handshake协议协商获得。 具体过程 随机数交换 Client/Server相互…

支付宝商家转账到账户余额,支持多商户管理

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…

基于Django的旅游信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;随着…

常见的框架漏洞复现

1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&#xff0c;通过覆盖类的核心属性filter导致rce&#xff0c;其攻击点较为多&…

UE5中实现右键开镜效果

右键之后添加时间轴&#xff0c;然后设置视野即可。Set Field Of View 时间轴设置&#xff0c;第一个点设置0,90度&#xff0c;因为默认的就是90度 第二个点看武器的类型或者倍境来设置&#xff0c;时间就是开镜时间&#xff0c;值越小开镜速度越快&#xff0c;第二个值就是视野…

关于华硕Armoury Crate(奥创中心)安装程序失败、卡进度条问题解决方案

关于华硕Armoury Crate(奥创中心&#xff09;安装失败解决方案 清理旧版本文件 如果之前安装过Armoury Crate&#xff0c;可能有残留文件导致冲突&#xff1a; 利用官方的卸载工具&#xff0c;卸载旧版本&#xff1a; https://www.asus.com.cn/supportonly/armoury%20crate/…