目录go快速入门go基本概念基本数据类型常量变量运算符go快速入门Go语言简介Go语言,通常称为Golang,是由Google设计的一种静态类型、编译型的编程语言。它旨在提高开发者的生产力,简化并加速软件开发流程。Go语言具有以下特点:简洁性:Go语言语法简单,易于学习,没有
Go语言,通常称为Golang,是由Google设计的一种静态类型、编译型的编程语言。它旨在提高开发者的生产力,简化并加速软件开发流程。Go语言具有以下特点:
开发环境搭建
第一个Go程序 创建一个新的目录作为工作区,并在其中编写第一个Go程序:
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
保存文件为hello.go
,然后在命令行中运行:
go run hello.go
项目结构 一个典型的Go项目结构可能如下所示:
myproject/
├── cmd/
│ └── myapp/
│ ├── main.go
│ └── ...
├── internal/
│ ├── pkg1/
│ │ ├── pkg1.go
│ │ └── ...
│ └── pkg2/
│ ├── pkg2.go
│ └── ...
├── pkg/
│ ├── pkg3/
│ │ ├── pkg3.go
│ │ └── ...
│ └── pkg4/
│ ├── pkg4.go
│ └── ...
├── go.mod
└── go.sum
cmd/
: 包含应用程序入口点,每个子目录代表一个可执行命令。internal/
: 存放内部包,这些包只能被项目内的其他包访问。pkg/
: 存放外部可以依赖的包。go.mod
: Go模块元数据文件,用于管理依赖关系。go.sum
: 文件包含直接和间接依赖的校验和,确保依赖的一致性和安全性。构建与测试 你可以通过以下命令来构建你的Go应用:
go build -o myapp ./cmd/myapp
对于测试,Go的标准库提供了一个简单的测试框架,可以通过下面的命令来运行测试:
go test ./...
Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则:
Go只有25个关键字 break、default、func、interface、select、case、defer、go、map、struct、chan、else、goto、package、switch、const、fallthrough、if 、range、ype、continue、for、import、return、var
Go还有37个保留字
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete complex real imag panic recover
可见性:
有四种主要声明方式:
var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array // 固定长度的数组
- slice -- 序列数组(最常用)
- map -- 映射
- chan -- 管道
go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。
相同点:
- 两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
- init可以应用于任意包中,且可以重复定义多个。
- main函数只能用于main包中,且只能定义一个。
两个函数的执行顺序:
对同一个go文件的init()调用顺序是从上到下的。
对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。
对于不同的package,如果不相互依赖的话,按照main包中”先import的后调用”的顺序调用其包中的init(),如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。
整型分为以下两个大类: 按长度分为:int8
、int16
、int32
、int64
对应的无符号整型:uint8
、uint16
、uint32
、uint64
其中,uint8
就是我们熟知的byte
型,int16
对应C语言中的short
型,int64
对应C语言中的long
型。
Go语言支持两种浮点型数:float32
和float64
。这两种浮点型数据格式遵循IEEE 754
标准: float32
的浮点数的最大范围约为3.4e38
,可以使用常量定义:math.MaxFloat32
。 float64
的浮点数的最大范围约为 1.8e308
,可以使用一个常量定义:math.MaxFloat64
。
complex64
和complex128
复数有实部和虚部,complex64
的实部和虚部为32位,complex128
的实部和虚部为64位。
Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true
(真)和false
(假)两个值。
Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int
、bool
、float32
、float64
等)一样。 Go 语言里的字符串的内部实现使用UTF-8
编码。 字符串的值为双引号(“)中的内容,可以在Go语言的源码中直接添加非ASCII码字符,
Go语言中要定义一个多行字符串时,就必须使用反引号字符:
s1 := `第一行
第二行
第三行
`
fmt.Println(s1)
Go 语言的字符有以下两种:
当需要处理中文、日文或者其他复合字符时,则需要用到rune
类型。rune
类型实际是一个int32
。
Go 使用了特殊的 rune
类型来处理 Unicode
,让基于 Unicode
的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾
// 遍历字符串
func traversalString() {
s := "pprof.cn博客"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()
for _, r := range s { //rune
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}
要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
func changeString() {
s1 := "hello"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'H'
fmt.Println(string(byteS1))
s2 := "博客"
runeS2 := []rune(s2)
runeS2[0] = '狗'
fmt.Println(string(runeS2))
}
强制类型转换的基本语法如下:T(表达式)其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.
func sqrtDemo() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}
相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。 常量的声明和变量声明非常类似,只是把var换成了const,常量在定义的时候必须赋值。
const pi = 3.1415
const e = 2.7182
// 多个常量也可以一起声明
const (
pi = 3.1415
e = 2.7182
)
const (
n1 = 100
n2
n3
)
// iota是go语言的常量计数器,只能在常量的表达式中使用。iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。
const (
n1 = iota //0
n2 //1
_
n4 //3
)
const (
n1 = iota //0
n2 = 100 //100
n3 = iota //2
n4 //3
)
var 变量名 变量类型; var 变量名 类型 = 表达式
var name string
var age int
var isOk bool
var name string = "pprof.cn"
var sex int = 1
var name, sex = "pprof.cn", 1
func main() {
n := 10
m := 200 // 此处声明局部变量m
fmt.Println(m, n)
x, _ := foo()
_, y := foo() // 匿名变量
}
func foo() (int, string) {
return 10, "Q1mi"
}
+
相加-
相减*
相乘/
相除%
求余==
检查两个值是否相等,如果相等返回 True 否则返回 False。!=
检查两个值是否不相等,如果不相等返回 True 否则返回 False。>
检查左边值是否大于右边值,如果是返回 True 否则返回 False。>=
检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。<
检查左边值是否小于右边值,如果是返回 True 否则返回 False。<=
检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。&&
逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。ll
逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。!
逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。&
参与运算的两数各对应的二进位相与。(两位均为1才为1)l
参与运算的两数各对应的二进位相或。(两位有一个为1就为1)^
参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。(两位不一样则为1)<<
左移n位就是乘以2的n次方。>>
右移n位就是除以2的n次方。“a>>b”是把a的各二进位全部右移b位。=
简单的赋值运算符,将一个表达式的值赋给一个左值+=
相加后再赋值-=
相减后再赋值*=
相乘后再赋值/=
相除后再赋值%=
求余后再赋值<<=
左移后赋值>>=
右移后赋值&=
按位与后赋值l=
按位或后赋值^=
按位异或后赋值如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!