安装
# go version 查看Go版本
C:\Users\Administrator>go version
go version go1.21.5 windows/amd64
配置环境变量
Linux :
sudo vim /etc/profile
export GOROOT=/opt/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/home/d5v/GoWorke
新建初始目录
mkdir $GOPATH/src
mkdir $GOPATH/pkg
mkdir $GOPATH/bin
第一个程序
package main
import "fmt"
func main() {
fmt.Print("hello world")
}
package main
软件包 main包是Go的入口 main包 包含一个 main函数 作为入口函数import "fmt"
导入系统输入输出的模块
注释
使用 // 开头
或者使用 /* */
和 C 一样
// 单行只是
/*
多行注释
*/
变量
使用 var
关键词定义变量
var name string = "dbp"
var age int = 18
var 名字 string = "包皮哥"
var __年龄__ = int = 18
// 以上是正确的命名方法 可以使用中文
同时定义多个值
var (
name2 string
age2 int
addr string
password int = 1
username, email string = "None", "None"
)
可以给初始值也可以不给 但是类型是必须的
hhhh := "自动推导类型"
var (
hhh = "感觉不如直接var 可以不用:= 也能推导"
)
交换变量
println(age, &age, age2, &age2)
age, age2 = age2, age
println(age, &age, age2, &age2)
匿名变量
var _, a = f1(1, 2)
// _ 的值会被删除 并可以重复定义
作用域
定义在文件内 func 外的变量叫做全局变量 可以不调用 不会报错
定义在 func 内的变量叫做局部变量 只能在本函数内被调用
var globalName = "global"
func main() {
var localName = "local"
...
}
在调用时 如果局部变量含有想用名称的变量 覆盖全局变量 局部优先级高于全局变量
常量
定义之后 不可改变的量 被称为常量
常量不使用不会报错
常量不能没有初始值
const URL string = "www.baidu.com"
const URL2 string = "fanyi.baidu.com"
const (
URL3 string = "hello"
URL4 string = "hello4"
URL5, URL6 = "nmsl", "cnm"
)
特殊常量 iota
iota是一个常量计数器
const (
c = iota // 0
b = iota // 1
a // 2 不写赋值 自动跟随上一个值
d = "hello" // hello
e // hello
f = iota // 5 就算一个 const() 中的变量 不等于 iota 也会计数
g // 6
)
数据类型
布尔类型 bool true false 两个值
整形
uint
无负数整数 无符号整数uint8
uint16
uint32
uint64
.int
int8
int16
int32
int64
byte
=uint8
rune
=int32
浮点数
float32
float64
字符串
string
运算符
& 取内存地址
// 取地址符号 &
fmt.Printf("value: [%d], memory of: [%p]\n", age, &age)
age = 200
fmt.Printf("value: [%d], memory of: [%p]\n", age, &age)
*
根据内存地址取值
var i1 int = 10
var address *int = &i1
println(*address)
> 10
算数运算
+ - * / %
i++
自增i--
自减
关系运算符
==
≠
>
<
≥
≤
逻辑运算符
&&
与||
或!
非
函数
定义
// 普通函数
func test1() (a int, b int) {
return 1, 2
}
func 函数名(参数列表) (返回值列表) {
代码块
return 返回值列表
}
// 局部函数
var i = func() (a int, b int) {
return 1, 2
}
i := func() (int, int) {
return 1, 2
}
var 函数名 = func(参数列表) (返回值列表) {
代码块
return 返回值列表
}
// 匿名函数
func (a, b) {
代码块
}(a, b)
// 接受多个或单个参数
a := func1()
_ := func1() // 不需要返回参数
_, err := func1()
value, err := func1()
Println() Print()
参数:
*args
fmt.Println("hello world", "!")
fmt.Println("hello world" + "!")
var (
a = "hello"
b = "world"
)
fmt.Println(a, b)
// 高版本好像可以直接print 不用导入 fmt
print("hello world\n")
println("hello", "world")
fmt.Println("hello", "world"+"!")
fmt.Printf("%s", "hello world")
printf 的标识符:
%T
类型%t
值%f
浮点数 变种%.2f
保留两位小数%d
整数%lf
float64 双精度浮点%s
字符串%c
char%v
所有类型
append()
// append 函数用于给切片、类型拓展一个值
books = []string
books = append(books, "hello")
流程控制
if
if 条件 {}
else if 条件 {}
else {}
if 条件 {
if 条件 {
} else {}
}
switch
switch 变量 {
case 匹配值:
代码块
case 匹配值1, 匹配值2:
代码块
break // 跳出
default:
匹配不到执行的代码块
fallthrough // 穿透
}
select
// 同时监控多个管道
select {
case x := <- c1: // 如果管道可读
x 代码块
case <- c1: // 可读但不要值
代码块
case c1 <- x: // 如果管道可写
default:
默认代码块
}
for
for i := 1; i <= 100; i++ {
...
}
for 定义变量;循环条件;每次循环后执行 {
代码块
}
for ; 条件 ; 每次循环后执行 {
代码块
}
for ;; 每次循环后执行 {
无限循环 代码块
}
for ; 条件 ; {
代码块
}
for {
无限循环 代码块
}
// 迭代map
for index, value := range books {
代码块
}