go语言学习--基础篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习--基础篇相关的知识,希望对你有一定的参考价值。

一,第一个go程序,hello world!!! 

 创建learngo目录,再创建src,最后编写hello.go文件

package main

import (
      "fmt"
)

func main(){
     fmt.Printf("hello world!!!")
}

从第一个go程序中,我们可以初始认识一下go 语言的程序结构

1,package 声明go语言的包,

2,import 导入包

3,func main() {} go语言函数

       在go语言中 需要注意的几个地方

      (1)packeage main 表示这个包是可以编译成可执行文件的(可执行文件和库的区别是,可执行文件编译完成之后,就可以独自执行,如果是库文件编译完后只能生产一个lib库,lib库只能被其它可执行程序调用)

      (2)go 语言中导入的包或者定义的变量,函数等,需要在程序中使用,如果没有使用,程序编译会报错。这也是Go语言中遵循极简的编程思路

编写完第一个go程序后,如何运行? 找到你编写的go 文件,然后执行 go run  src/hello.go(快速执行go 文件)

 

二,go 语言中命令的常规使用

     (1)go语言环境变量的查看,在windows 下执行go env 即可列出go语言的所有环境变量

              这些变量中最重要的是GOPATH,所有的源码,程序都放在GOPATH中,GOPATH 路径最好只设置一个

              另外 go 语言有是跨平台的,在windows 下编写一个go 程序,完成编译后,在Linux下任然可以执行

技术分享图片

        (2)go build  命令是用来编译go 程序的,编译完成之后会生成一个.exe 二进制文件,这个文件不论放在那里都可以执行, go  build   project/webdev/main, 在编译命令中,只需要写src 以后的文件路径就可以

        (3)go install 命令是安装可执行文件到bin目录  go install project/webdev/main,第一次执行go install后GOpath 中会自动生成一个bin 目录,这个bin 目录存放所有编译后的可执行程序

        (4).\\ 就可以运行编译后的可执行的.exe  文件

        (5)go test 执行单元测试,源码文件名称中加上_test ,在文件中定义函数,函数命定义func  Testadd(t *testing.T),go 语言在编译中不会将测试文件编译到其中

        技术分享图片

         测试代码示例

package calc

import (

    "testing"                                  #导入testing 模块 
)

func TestAdd(t *testing.T) {                   #test 函数定义

       var sum int
       sum = Add(5, 6)                              
       if sum != 10 {
           t.Fatalf("add is not right, sum:%v expected:11",sum)           #定义出错时输出
       }
       t.Logf("add  is ok")                   #打印正确日志
}

          (6)go fmt 格式化所有源码,将源码的格式进行标准化, go fmt  -w ./* 可以当前目录下所有文件都格式化

三,编写自定义的go 语言包

          (1)新建一个目录,例如calc

package cale                          #声明这个包的名字,最好是和自己所创建的目录一致

func Add(a int, b int) int {          #本句中,前两个int是声明参数的数据类型,后一个int为返回值的类型
                                      #go 语言为强类型语言,变量一般都需要指定类型     
       return a+b

}

        (2)新建go的包后,如何在其它代码中引导入,(注意,导入的时候需要把整个包都导入,不能单独导入包中的某个.go文件)

package main

import (

   "fmt" 
   cale "project/webdev/calc"             #导入自定义包(导入路径是src之后的路径)
#路径前面的cale为包设置别名 ) func main() { x := calc.Add(1,2) #go 语言中包中的函数的调用,包的名字的.函数导入 fmt.Printf("x:%d".x) }

        (3)go 语言中包的组织,需要注意,在同一个目录下,所有的go 源码文件中声名包都只能有一个,即package  包名  只能有一个,如果出现多个,会出现编译报错,另外,包的名字为main 而且有func main 这个包编译完之后是可执行的

         技术分享图片

四,go 语言多线程的定义

       基于CSP 模型实现

        func calc() {

          //大量计算

        }

       func main() {

           go calc()                  #在函数前面添加go 语句

        }

五,go语言中程序通信方式----只有管道

    (1)管道,类似unix/linux中的pipe

    (2)多个goroute 之间通过channel进行通信

    (3)支持go语言中的任何类型

func main() {
  
      pipe := make(chan int,3)              #pip := 定义pip 变量,make  分配空间
      pipe <- 1                             #chan 管道,int 为管道中的数据类型,3为管道的内存大小
      pipe <- 2                             #<- 存入数据
var a int
a <- pipe #读取管道中的数据 }

   六,go语言返回多个值

    go语言中需要在函数定义时就定义返回值的类型

func calc(a int, b int) (int,int) {              #(int,int)定义返回值的类型

          sum := a+b
          avg  := (a+b)/2
          return sum, avg                        #返回多个值
}

 






以上是关于go语言学习--基础篇的主要内容,如果未能解决你的问题,请参考以下文章

你知道的Go切片扩容机制可能是错的

go+系列数组集合基础篇

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

go语言学习--基础篇

Go语言基准测试(benchmark)三部曲之一:基础篇

Go从入门到放弃