Go语言学习笔记(go语言学习-1)
Go语言学习笔记(go语言学习-1)// hello package main import ( "fmt" //标准输入输出包 ) func main() { fmt.Println("Hello World Hello Go!") }在命令行 进入源文件所在的目录手动创建一个hello.go文件.目前go版本已经是1.18 已经支持泛型了.go 命令提示信息如果看到和上图一样的效果 代表环境变量没有问题 其实也不会出现什么问题.
起因五四青年节(2017.05.04) 那天下午没有回去 公司规定28岁之前 下午可以不上班.就顺便看了go语言 算是做个笔记.
1. 进入正题 先安装go语言环境和liteidego语言环境下载地址:https://dl.gocn.io/golang/1.8/go1.8.windows-386.msi
go语言IDE环境下载地址:https://dl.gocn.io/editor/liteide/liteidex30.3.windows-qt5.zip
因为下载go语言环境是个安装包 在安装之后配置一下系统环境(1.8不需要).记得最早安装是go1.5 还需要自己配置环境变量.在命令行测试一下
目前go版本已经是1.18 已经支持泛型了.
go 命令提示信息
如果看到和上图一样的效果 代表环境变量没有问题 其实也不会出现什么问题.
2. 惯例 hello world你懂的!手动创建一个hello.go文件.
// hello
package main
import (
"fmt" //标准输入输出包
)
func main() {
fmt.Println("Hello World Hello Go!")
}
在命令行 进入源文件所在的目录
go build 编译源文件 生成可执行文件
3. 简单介绍上面的go文件(开始使用liteide)package main
//导入包两种方式
//1.导入单个包(package)
import "fmt" //输入输出的包 和c语言的stdio.h
import "runtime"
//2.导入多个包(package) 对比单个导入的方式 这个更友好
import (
"net/http" //http相关的包
"time" //时间相关的包
)
func main() {
fmt.Println("Hello World Hello Go!") //输出字符串
}
4. 定义变量 (和c/c /java/c#不同的) 不需要每行结束以分号
package main // hello
import (
"fmt"
)
func main() {
var i int //定义i1为int类型变量
i = 1 //为变量i1赋值为1
var x y int = 1 2 //定义多个相同类型的变量并赋值x=1 y=1
//var num int = 1 简写用法 语法糖
num := 1 //定义num变量值为1 该变量在编译时确定类型
}
5. 定义常量
//定义常量
const world = "go"
6. 条件语句
//条件语句
j := 100
if j > 1 {
fmt.Println("j < 0")
} else {
fmt.Print("j > 0")
}
7. switch语句
//分支判断
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("mac os!")
case "linux":
fmt.Println("linux !")
default:
fmt.Println("%s!" os)
}
8. 循环语句
for方式1:
//for使用1
sum := 0
for i := 0; i <= 100; i {
sum = i
}
fmt.Println("su
for方式2
//for使用2 go语言没有while语句
sum := 1
for sum < 1000 {
sum = sum
}
死循环 (还是和其他语言很不同的 没有 while(true) 用法)
//for 死循环
for {
//具体执行语句
}
9. 使用结构体(go语言没有class 只有struct)
//定义一个结构体
type Student struct {
X int
Y int
}
func main() {
//初始化结构体 并进行赋值
stu := Student{1 10}
//修改结构体变量的值
stu.X = 20
fmt.Println(stu) //输出结果为{20 10}
}
10. go语言中可以使用指针 但指针不能进行运算
val := 100
pVal := &val //取变量val的地址 将指针变量pVal指向val的地址
fmt.Println("指针pVal的值 " *pVal)
*pVal = 200
fmt.Println("pVal和val的值" *pVal val) //pVal和val的值 200 200
11. 数组
//定义固定大小字符串数组
var arr [2]string
//对数组元素进行赋值
arr[0] = "hello"
arr[1] = "go"
//输出单个元素
fmt.Println(arr[0] arr[1]) //结果:hello go
fmt.Println(arr) //结果:[hello go]
//定义int类型数组
arr2 := []int{1 2 3 4 5 6 7 8 9 10}
fmt.Println("arr2 ==" arr2)
//循环遍历数组元素
for i := 0; i < len(arr2); i {
fmt.Printf("arr[%d]=%d\n" i arr2[i])
}
12. 切片
//切片 java等语言没有这个特性 c#在8.0(.Net Core 3.0)也加入了切片
//切片比较方便 只要指定提取数组的区间 就生成一个新的数组
arr2 := []int{1 2 3 4 5 6 7 8 9 10}
//[:4]取第0个元素到第四个元素之间的元素
fmt.Println("arr2[:4]==" arr2[:4]) //arr2[:4]== [1 2 3 4]
// [1:4]取第一个元素到第四个元素之间的元素
fmt.Println("arr2[1:4]==" arr2[1:4]) //arr2[1:4]== [2 3 4]
//[4:] 取第四个元素(包含第四个元素)到数组的最后的一个元素
fmt.Println("arr2[4:]==" arr2[4:]) //arr2[1:4]== [5 6 7 8 9 10]
13. 字典
//字典 map
dic := make(map[string]int)
dic["userid"] = 100
dic["userinfo"] = 200
//遍历字典
for key val := range dic {
fmt.Printf("dic[%s]=%d\n" key val)
}
//输出结果
//dic[userid]=100
//dic[userinfo]=200
14. 协程(重要)
package main // hello
import (
"fmt"
"time"
)
func main() {
//协程:轻量级线程 在go语言中 弱化了线程的概念.
//在操作系统中 只有进程和线程 线程才是系统调度的最小单位
//暂且当成线程使用 使用很方便 比其他语言都要简单直接
go say("go")
say("hello ")
}
func say(content string) {
for i := 0; i < 2; i {
time.Sleep(100 * time.Millisecond) //要引入time
fmt.Printf("%s%d\n" content i)
}
//结果:还是和线程执行一样 执行顺序无法保证(不加同步限制)
//go0
//hello 0
//hello 1
//go1
}
15. channel 通道
package main // hello
import (
"fmt"
)
func main() {
//通道channel 用于协程之间传递数据
arr4 := []int{7 2 8 -9 4 0}
//1.先创建一个通道
c := make(chan int)
//2.通过切片将输入数组分别放入两个协程中执行
go sum(arr4[:len(arr4)/2] c)
go sum(arr4[len(arr4)/2:] c)
//3.从通道中取数据
x1 x2 := <-c <-c
fmt.Println(x1 x2 x1 x2)
}
func sum(arr []int c chan int) {
sum := 0
for _ v := range arr {
sum = v
}
//将数据放入通道
c <- sum
}
结论
对go语言进行了简单的学习 还是有很多的收获.
- go语言 声明变量语法和JavaScript类型
- 语法做了很多简化 自带代码格式化工具 如果不符合规范 是无法格式化的
- go语言原生支持协程 其他语言用第三方库也是可以实现的
- go语言对http使用 特别简单
因为最近事情比较多 没有较多的时间 写新的东西.关于go学习笔记有3篇 这个迁移比较快
个人能力有限 如果您发现有什么不对 请私信我
如果您觉得对您有用的话 可以点个赞或者加个关注 欢迎大家一起进行技术交流