跟我一起从入门到精通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 延迟

  1. defer 用于注册延迟调用。
  2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。
  3. 多个defer语句,按先进后出的方式执行。
  4. 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的主要内容,如果未能解决你的问题,请参考以下文章

跟我一起学Go系列:日志系统从入门到晋级

Go 从入门到精通字符串,时间,流程控制,函数

go语言教程哪里有?Go从入门到精通系列视频3.1 对称加密算法

GoGin从入门到精通—如何理解安装Gin并在本地运行

GoGin从入门到精通—如何理解安装Gin并在本地运行

GoGin从入门到精通-哪有那么多为什么