环境准备
下载连接:
https://studygolang.com/dl
https://golang.google.cn/dl
#linux安装方法
[root@ubuntu2004 ~]#tar xf go1.19.2.linux-amd64.tar.gz -C /usr/local
[root@ubuntu2004 ~]#mkdir /data/go_path -p
[root@ubuntu2004 ~]#vim .bashrc
export GOROOT=/usr/local/go
export GOPATH=/data/go_path
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
export PATH=$PATH:$GOTOOR/bin:$GOPATH/bin
[root@ubuntu2004 ~]#source ~/.bashrc
[root@ubuntu2004 ~]#go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/data/go_path/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/data/go_path"
GOPRIVATE=""
GOPROXY="https://goproxy.cn"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.19.2"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1359194636=/tmp/go-build -gno-record-gcc-switches"
[root@ubuntu2004 ~]#mkdir /data/go_path/{src,pkg,bin}
[root@ubuntu2004 ~]#tree /data/go_path/
/data/go_path/
├── bin
├── pkg
└── src
安装go开发工具
web在线开发工具
https://play.golang.wiki
https://go.dev/play/
https://goplay.space/
https://goplay.tools/
goland(收费软件)
vscode(免费推荐使用)
地址:https://code.visualstudio.com/
三个简易的go代码
HelloWorld
创建项目目录
cmd内用go命令创建项目
D:\Program Files\go_projects\firstgo_projects>go mod init firstgo
go: creating new go.mod: module firstgo
使用Vscode打开项目
package main import ( "fmt" ) func main() { fmt.Println("Hello World") }
跨包引用
创建文件夹和调用的函数文件
package mypath func Add(a int, b int) int { return a + b }
package main import ( "firstgo/mypath" "fmt" ) func main() { a := 4 fmt.Println("Hello World", a) b := 7 c := mypath.Add(a, b) fmt.Print(c) }
第三方依赖库
下载依赖
PS D:\Program Files\go_projects\firstgo_projects> go get gonum.org/v1/gonum/stat
go: downloading gonum.org/v1/gonum v0.12.0
go: added gonum.org/v1/gonum v0.12.0
package main import ( "firstgo/mypath" "fmt" "gonum.org/v1/gonum/stat" ) func main() { a := 4 fmt.Println("Hello World", a) b := 7 c := mypath.Add(a, b) fmt.Println(c) arr := []float64{1, 2, 3, 4, 5, 6, 7, 8} v := stat.Variance(arr, nil) fmt.Printf("方差=%f\n", v) }
常用Go命令
1.查看帮助文档
go help
2.对源码文件进行打包构建,生成可执行文件
go build -o <name> <sourcefile>
3.编译并安装包到$GOPATH/bin下
go install <sourcefile>
4.下载第三方依赖库到当前module中
go get <dependency package>
5.创建go项目
go mod init <name>
6.扫描当前项目中是否调用了但未添加的依赖或删除未被使用的依赖
go mod tidy <name>
7.对代码进行格式化
go fmt entrance <file>
8.查看库帮助文档
go doc <dependency package>
9.查看go的版本
go version
10.查看go环境信息
go env
GO标识符和关键字
go变量、常量、自定义类型、包、函数的命名方式需要遵循以下规则:
1.首字符可以是任意Unicode字符或下划写
2.首字符可以是任意Unicode字符、下划写或数字
3.名字长度无限制
关键字
break default func interface select defer case map struct go chan else package
switch goto constif type continue range for impor treturn fallthrough var
保留字
·常量
true false iota nil
·数据类型
int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error
·函数
make len cap new append copy close delete complexreal imag panic recover
操作符与表达式
运算符 | 描述 |
+ | 加 |
– | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
== | 判断是否相等 |
!= | 判断是否不等 |
> | 判断是否大于 |
>= | 判断是否大于等于 |
< | 判断是否小于 |
<= | 判断是否小于等于 |
&& | 逻辑运算符,与运算,两个都为真结果才真,否则假 |
|| | 逻辑运算符,或运算,只需一个为真结果为真,否则为假 |
! | 逻辑运算符,取反运算 |
& | 参与运算的两组二进制数对应位相与(同为1为1,不同则为0) |
| | 参与运算的两组二进制数对应位相或(有一个为1则为1,都为0则为0) |
^ | 参与运算的两组二进制数对应位异或(不同为1,相同为0);对于单个二进制数据运算时表示按位取反,符号位也要改变 |
<< | 对二进制数进行左移n位,就是乘以2的n次方. |
>> | 对二进制数进行右移n位,就是除以2的n次方. |
= | 简单赋值 |
+= | 相加后赋值 |
-= | 相减后赋值 |
*= | 相乘后赋值 |
/= | 相除后赋值 |
%= | 取余后赋值 |
<<= | 位运算向左移后赋值 |
>>= | 位运算向右移后赋值 |
&= | 位运算相与后赋值 |
|= | 位运算相或后赋值 |
^= | 位运算相异或后赋值 |
变量常量字面量
变量
类型 | go变量类型 | fmt输出 |
整形 | int int8 int32 int64 uint uint8 uint16 uint16 uint32 uint64 | %d |
浮点型 | float32 float64 | %f %e %g |
复数 | complex128 complex64 | %v |
布尔型 | bool | %t |
指针 | uinptr | %p |
引用 | map slice channel | %v |
字节 | byte | %d |
任意字符 | rune | %d %c |
字符串 | string | %s |
错误 | error | %v |
变量初始化
● 如果声明后未显式初始化,数值型初始化0,字符串初始化为空字符串,布尔型初始化为false,引用类型、函数、指针、接口初始化为nil
● var a string=”china”
● var a,b int=3,7
● var a=”china”,类型推断
● var a,b=”china”,7
变量初始化
● 函数内部的变量(非全局变量)可以通过:=声明并初始化
● a:=3
● 下划线表示匿名变量
● _=2+4
● 匿名变量不占命名空间,不会分配内存,因此可以重复使用
常量
常量在定义时必须赋值,且程序运行期间其值不能改变
const Pl float32=3.14 const(
const( a=100
PI=3.14 b //100,跟上一行的值相同
E=2.71 c //100,跟上一行的值相同
) )
iota
const( const( const(
a=iota//0 a=iota//0 a=iota//0
b //1 b //1 b=30
c //2 _ //2 c=iota//2
d //3 d //3 d //3
) ) )
字面量
●字面量:没有出现变量名,直接出现了值。基础类型的字面量相当于是常量
fmt.Printf(” %t\n”,04 == 4.00)//用到了整型字面量和浮点型字面量
fmt.Printf(“%v\n”, .4i)//虚数字面量0.4i
fmt.Printf(“%t\n”, ‘\u4f17’== ‘众’Y//Unicode和rune字面量
fmt.Printf(“Hello\nWorld\n!\n”)//字符串字面量
变量的作用域
var (
A=3 //全局变量,大写字母开头,所有地方都可以访问,跨package访问时需要带上package名称
b=4 //全局变量,小写字母开头,本package内都可以访问
)
func foo(){
b:=5 //局部变量,仅本函数内可以访问。内部声明的变量可以跟外部声明的变量有冲突,以内部的为准
{b:=6 //仅0圈定的作用域内可以访问,可以跟外部的变量有冲突}
}
代码示例
package main import ( "fmt" "runtime" "strconv" "test1/util" ) func atc() { var a float32 = 8 var b float32 = 3 var c float32 = a + b var d float32 = a - b var e float32 = a * b var f float32 = a / b var n int = 8 var m int = 3 var g int = n % m fmt.Printf("c=%f\n", c) fmt.Println(d) fmt.Println(e) fmt.Println(f) fmt.Println(g) } func rel() { var a float32 = 8 var b float32 = 3 var c float32 = 5 fmt.Println(a > b) fmt.Println(a > b && b > c) fmt.Println(a > b || b < c) fmt.Println(b > c || a > b) fmt.Println(!(a > b)) } func bit_op() { fmt.Printf("os arch %s, int size %d\n", runtime.GOARCH, strconv.IntSize) fmt.Printf("260 %s\n", util.BinaryFormat(260)) //260=2^8+2^2 从零开始算第二位和第八位为1,100000100 fmt.Printf("-260 %s\n", util.BinaryFormat(-260)) fmt.Printf("260>>23 %s\n", util.BinaryFormat(260>>23)) fmt.Printf("260<<23 %s\n", util.BinaryFormat(260<<23)) fmt.Printf("-260>>23 %s\n", util.BinaryFormat(-260>>23)) fmt.Printf("-260<<23 %s\n", util.BinaryFormat(-260<<23)) fmt.Printf("%d\n", 6&8) // 6 0110 & 8 1000 = 13 0000 fmt.Printf("%d\n", 6|8) // 6 0110 | 8 1000 = 14 1110 fmt.Printf("%d\n", 6^5) // 6 0110 ^ 5 0101 = 3 0011 fmt.Printf("%d\n", ^5) // fmt.Printf("%b\n", 5>>1) // 5 0101 = 0010 fmt.Printf("%b\n", 5<<1) // 5 0101 = 1010 } func test() { var a int = 7 var b int = a / 2 var c int = a >> 1 //性能快于普通运算,底层架构尝使用 fmt.Println(b, c) } func prt() { a := 5 prt := &a fmt.Printf("%p %d %x\n", prt, prt, prt) } func test2() { a := 50000000000000.0 fmt.Printf("%f\n", a) fmt.Printf("%e\n", a) fmt.Printf("%g\n", a) fmt.Printf("%.0f\n", a) fmt.Printf("%e.0\n", a) fmt.Printf("%g\n", a) var u uint = 255 // 2^8 255 11111111 var b byte = 255 //=uint8 var d rune = 10000 fmt.Printf("%d\n", u) fmt.Printf("%d\n", b) fmt.Printf("%c\n", u) fmt.Printf("%c\n", d) } func test3() { const ( a = iota b c d ) println(a, b, c, d) const ( _ = 1 << (10 * iota) KB = 1 << (10 * iota) MB = 1 << (10 * iota) GB = 1 << (10 * iota) TB = 1 << (10 * iota) ) println("KB=", KB) println("MB=", MB) println("GB=", GB) println("TB=", TB) var r rune = '舒' fmt.Printf("%d %x\n", r, r) fmt.Printf("%t\n", '舒' == '\u8212') } var ( A = 3 b = 2 ) func scop() { fmt.Printf("A=%d\n", A) fmt.Printf("b=%d\n", b) b := 5 fmt.Printf("b=%d\n", b) C := "abc" fmt.Printf("C=%s\n", C) { C := 9 D := false fmt.Printf("C=%d,D=%t\n", C, D) } fmt.Printf("C=%s\n", C) } func main() { atc() rel() bit_op() test() prt() test2() test3() scop() }
package util import ( "math" "strings" ) func BinaryFormat(n int64) string { sb := strings.Builder{} //字符串连接 c := int64(math.Pow(2, 31)) //math.Pow()此处表示的是2的31次方 //fmt.Println(c) for i := 0; i < 32; i++ { if n&c != 0 { sb.WriteString("1") } else { sb.WriteString("0") } c >>= 1 } return sb.String() }
PS D:\Program Files\go_projects\test1> go run .\oprator\mian.go c=11.000000 5 24 2.6666667 2 true false true true false os arch amd64, int size 64 260 00000000000000000000000100000100 -260 11111111111111111111111011111100 260>>23 00000000000000000000000000000000 260<<23 10000010000000000000000000000000 -260>>23 11111111111111111111111111111111 -260<<23 01111110000000000000000000000000 0 14 3 -6 10 1010 3 3 0xc0000a61c8 824634401224 c0000a61c8 50000000000000.000000 5.000000e+13 5e+13 50000000000000 5.000000e+13.0 5e+13 255 255 ÿ ✐ 0 1 2 3 KB= 1024 MB= 1048576 GB= 1073741824 TB= 1099511627776 33298 8212 true A=3 b=2 b=5 C=abc C=9,D=false C=abc
注释和go doc和godoc
注释
●单行注释。以//打头
●多行注释。连续多行以//打头,或者在段前使用/,段尾使用/
●多行注释之间不能出现空行
●NOTE:引人注意,TOD0:将来需要优化,Deprecated:变量或函数强烈建议不要再使用
●注释行前加缩进即可写go代码
注释的位置
●包注释。在package xxx的上方。一个包只需要在一个地方写包注释,通常会专门写一个doc.go,里面只有一行packagexxx和关于包的注释
●结构体注释。在type xxx struct上方·函数注释。在func xxx()上方
●行注释。在行上方或右侧
go doc
●go doc是go自带的命令
●go doc entranc …class/util
godoc
godoc可以为项目代码导出网页版的注释文档
●需要先安装go get golang.org/x/tools/cmd/godoc·启动http: godoc -http=:6060
●用浏览器访问:http://127.0.0.1:6060/pkg/go-course/entrance..class