编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

go语言学习-1(go语言从入门到进阶实战)

wxchong 2024-07-02 03:20:47 开源技术 45 ℃ 0 评论

起因

五四青年节(2017.05.04),那天下午没有回去,公司规定28岁之前,下午可以不上班.就顺便看了go语言,算是做个笔记.

1. 进入正题,先安装go语言环境和liteide

go语言环境下载地址: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,已经支持泛型了.

如果看到和上图一样的效果,代表环境变量没有问题,其实也不会出现什么问题.

2. 惯例,hello world你懂的!

手动创建一个hello.go文件.

// hello
package main

import (
	"fmt" //标准输入输出包
)

func main() {
	fmt.Println("Hello World,Hello Go!")
}

在命令行,进入源文件所在的目录

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语言进行了简单的学习,还是有很多的收获.

  1. go语言,声明变量语法和JavaScript类型
  2. 语法做了很多简化,自带代码格式化工具,如果不符合规范,是无法格式化的
  3. go语言原生支持协程,其他语言用第三方库也是可以实现的
  4. go语言对http使用,特别简单

因为最近事情比较多,没有较多的时间,写新的东西.关于go学习笔记有3篇,这个迁移比较快,

个人能力有限,如果您发现有什么不对,请私信我

如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表