跟我一起从入门到精通go
Posted mr.杰瑞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟我一起从入门到精通go相关的知识,希望对你有一定的参考价值。
go
安装环境
下载go并运行第一个go程序
下载,配置环境变量
brew install go
cd ~
vim .bash_profile
export GOPATH=/Users/xxx/Code/Go # 此处是你的go代码存放处
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
保存环境变量
source ~/.bash_profile
编辑第一个hello.go程序
运行 go run hello.go
生成编译文件 go build hello.go
go 25个关键字
break
1.首先如果要输出 要引入fmt的包
2.= 和 := 区别 =要用var 来声明变量 := 是直接声明变量并赋值
3.break 的含义和php不同, 循环嵌套循环时,可以在break 后指定标签。用标签决定哪个循环被终止 (注意下面的例子的label1,可以随意定义名字),中止的是从哪层定义
而php是中止当前循环
package main
import ("fmt")
func main()
label1:
for i := 0; i < 4; i++
for j := 0; j < 10; j++
if j == 2
break label1
fmt.Println("j = ", j , "i = ", i)
for($i=0;$i<4;$i++)
for($j=0;$j<10;$j++)
if($j==2) break;
var_dump('j='.$j." i=".$i);
case
1.和php 用法有差异,不用break了
go
package main
import ("fmt")
func main()
var str="hello"
switch str
case "good":
fmt.Println("good")
case "hello":
fmt.Println("hello")
default:
fmt.Println("默认")
php
$str = "hello";
switch($str)
case $str=="good":
var_dump("good");
break;
case $str=="hello":
var_dump("hello");
break;
default:
var_dump("默认");
2.如果想要在一个分支能匹配多个值呢?php 直接加判断条件 ,go :除了加判断条件,还可以case 表达式使用逗号分隔,
go
package main
import ("fmt")
func main()
var str="good"
switch str
case "hello","good":
fmt.Printf("一分支,多值:%s \\n",str)
default:
fmt.Printf("走默认")
package main
import ("fmt")
func main()
var num=10
switch
case num>1 && num<8:
fmt.Println("小于8")
case num>8 && num<10:
fmt.Println("大于8,小于10的数")
default:
fmt.Println("默认")
chan
const
和php 用法一样都是用来定义常量
package main
import ("fmt")
const (
P = 3.1415926
A = 2.12
)
func main()
fmt.Println(P)
fmt.Println(A)
continue
与php语法一致
package main
import ("fmt")
func main()
for i:=0;i<=10;i++
if i<8
continue
fmt.Println(i)
default
switch语句用到 默认会走哪种情况
defer
defer 延迟
- defer 用于注册延迟调用。
- 这些调用直到 return 前才被执。因此,可以用来做资源清理。
- 多个defer语句,按先进后出的方式执行。
- defer语句中的变量,在defer声明时就决定了。
package main
import ("fmt")
func main()
var data [5]struct
for i:= range data
defer fmt.Println(i)
else
if else用法没啥可说的
fallthrough
switch语句 从正确的分支开始作用
package main
import ("fmt")
func main()
s := "ab";
switch s[1]
case 'a':
fmt.Println("第一个a")
fallthrough
case 'b':
fmt.Println("第一个b");
fallthrough
case 'c':
fmt.Println("第一个c")
default:
fmt.Println("default case")
for
和php类似
package main
import (
"fmt"
)
func testFor()
var i int
for i=1;i<10;i++
fmt.Printf("i=%d\\n",i)
fmt.Printf("final:i=%d\\n",i)
func main()
testFor()
func
定义函数使用关键字func,且左侧大括号不能另起一行
go
go关键字定义了golang的并发编程goroutine
什么是goroutine?
goroutine是建立在线程上的轻量级的抽象,允许以很低的代价在同一个地址空间中并行的执行多个函数或方法,相比于线程,它的创建和销毁代价很小,且它的调度是独立于线程的。在go语言中使用go关键字创建一个goroutine
print函数启用了并发编程,这个函数调用时是并发执行的,goroutine默认使用电脑的所有核心,其他核在进行go关键字后面的函数运算,但是由于程序执行完main函数结束后立刻结束,因此不确定其他核的函数有没有执行完毕,也就造成了每次运行打印的数字个数不一样。
因为非单核处理并且内存逃逸,导致每次打印的数字都不一样
package main
import "fmt"
func main()
go func()
fmt.Println("Box1")
fmt.Println("box2")
fmt.Println("box3")
()
fmt.Println("Box4")
fmt.Println("Box5")
fmt.Println("Box6")
结果有很多
那怎么打印所有的数字呢?
package main
import (
"fmt"
"time"
"runtime"
)
func main()
go func()
fmt.Println("Box1")
fmt.Println("box2")
fmt.Println("box3")
()
fmt.Println("Box4")
fmt.Println("Box5")
fmt.Println("Box6")
runtime.Gosched()
time.Sleep(time.Second)
结果
goto
goto 进行代码间的无条件跳转。goto 语句可以在快速跳出循环、避免重复退出
package main
import "fmt"
func main()
for x:=0; x<10; x++
for y :=0; y<10; y++
if y == 2
//goto 跳
goto here
//避免执行标签
return
here:
fmt.Println("跳转到这里")
if
条件语句
import
用来导入包文件
interface
map
package
range
return
select
struct
switch
type
var
声明变量的
并发编程之同步原语 sync包
sync.Mutex 在共享资源上不能同时访问
var (mutex sync.Mutex)
//加锁
mutex.Lock()
mutex.Unlock
sync.RWMutex是一个读写互斥锁
sync.WaitGroup
在这里插入代码片
测试遇到的小知识点
printf和println的区别
printf在需要格式化的地方输出,其他直接输出变量或者直接输出字符串的可以直接用println
结果
如何引入自己写的包
go默认的包在
/usr/local/Cellar/go/1.16.4/libexec/src
只用把写的包放这里就行了
未完待续~
以上是关于跟我一起从入门到精通go的主要内容,如果未能解决你的问题,请参考以下文章