1.为什么用go:
- 高性能,高并发
- 语法简单,学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接(静态编译)
- 快速编译;跨平台
- 垃圾回收(无需考虑内存的分布和释放)
2.开发环境
- 安装go,进行环境配置
- 开发环境:
1.可以选择vscode(需要装配相关插件)
2.安装Goland,有30天的试用期,以下是下载链接
https://www.jetbrains.com/go/download/
3.基础语法
3.0 Hello,World!
package main //程序的入口
import (
"fmt" //格式化输入输出,导入fmt包
)
func main() {
fmt.Println("hello world") //主函数
}
- Println输出时,会自动换行;
- Printf输出时,只需要用%v进行,不需要区分%d,%s
- 打印结构体时,用%+v,打印结构体字段和值;
- 用%#v,打印整个结构体包括名字
- 打印浮点数和c语言一样,用%f
3.1 变量和常量
- c语言基础类型都有,字符串是内置变量
- 常量(const)无需类型,类型会在上下文自行判断
- 变量(var)
-
- 变量声明要注意Go和c不同的是Go中的变量类型要写在变量名后,如
var a int
- 变量声明要注意Go和c不同的是Go中的变量类型要写在变量名后,如
-
- 变量声明,用
:=
,类型加在变量名之后,如var b, c int=1,2
- 变量声明,用
var a = "initial"
字符串定义
var b, c int = 1, 2
整型数据
var d = true
布尔型定义
var e float64
浮点数定义
f := float32(e)
go语言支持科学计数法
const s string = "constant"
const h = 500000000
const i = 3e20 / h
常量无需声明类型
3.2 if…else条件语句
- 规则和c语言不同的地方:
- go中,if的判断条件无需加括号
- if语句必须用
{}
,且不能在同一排
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
3.3 循环
- go语言中只有for循环,且循环条件无需加括号,其余同c语言相同
- 该循环不会自动结束,需要用break结束
- continue用法同c语言相同
for j := 7; j < 9; j++ {
fmt.Println(j)
}
3.4 switch分支语句
和c语言的不同点:
- case语句中无需break,便可自动跳出
- 条件可以在case后加
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
3.5 go语言数组
- 切片与python类似,但要注意需要用len找到数组大小
- append:对数组扩容并赋值
- map映射:一般用make进行自变量映射,同时随机输出
- range:快速遍历,返回数组的内容及其下标
3.6 go函数
- 规则与c语言大同小异,要注意的是传入参数的类型应放在参数名之后
- 函数里对变量本身进行运算,需传入指针变量
func add2ptr(n *int) {
*n += 2
}
3.7 指针
- 指针的定义:和c语言相同(*)
3.8 Map
map 是 go 的一种 Key-Value 类型的数据结构,我们可以通过下面的命令声明一个 map :
m := make(map[string]int)
这里笔者感觉就是Python字典的Go形式
4. 编译
使用 go build 命令编译:
go build main.go
还有一种方法可以直接编译+运行:
go run main.go
5. 关于Go的面向对象
5.1 方法
方法是一个特殊类型的带有返回值的函数。返回值既可以是值,也可以是指针。
package main
import "fmt"
//定义结构体
type person struct {
name string
age int
gender string
}
// 方法定义
func (p *person) describe() {
fmt.Printf("%v is %v years old.", p.name, p.age)
}
func (p *person) setAge(age int) {
p.age = age
}
func (p person) setName(name string) {
p.name = name
}
func main() {
pp := &person{name: "Bob", age: 42, gender: "Male"}
pp.describe()
// => Bob is 42 years old
pp.setAge(45)
fmt.Println(pp.age)
//=> 45
pp.setName("Hari")
fmt.Println(pp.name)
//=> Bob
}
方法可以使用点号(.)直接调用,就像 pp.describe 这样。请注意,这个方法的返回值是指针类型。指针类型的返回值不会创建对象的新副本,从而节省了内存。
5.2 接口
Go 的接口是一系列方法的集合。接口有助于将类型的属性组合在一起。参考Java一个经典的面向对象例子,以接口 animal 为例,去实现接口
type animal interface { //接口定义
description() string
}
这里定义animal接口
package main
import (
"fmt"
)
type animal interface {
description() string
}
type cat struct {
Type string
Sound string
}
type dog struct {
Type string
Poisonous bool
}
func (d dog) description() string {
return fmt.Sprintf("Poisonous: %v", d.Poisonous)
}
func (c cat) description() string {
return fmt.Sprintf("Sound: %v", c.Sound)
}
func main() {
var a animal
a = dog{Poisonous: true}
fmt.Println(a.description())
a = cat{Sound: "Meow!!!"}
fmt.Println(a.description())
}
在 main 函数中, 我们创建了一个 animal 接口类型的变量 a。我们为 animal 接口指定了 dog 和 cat 两个实例对象,并使用 Println 方法打印 。
6. 引用参考
- 慕课网
- Go语言圣经