GO 语言学习

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4x1BgXFS-1577686100352)(https://i.loli.net/2019/12/30/EYWUsRAxlG9e6d2.jp)]

GO 语言学习

安装

  • Linux
下载 > 解压 > 设置
GOROOT
GOPATH
GOBIN
PATH

Mac
Windows

指令操作

go run 
   -v  列出被编译的代码包名称
   -a  强制执行
   -work 显示临时工作目录并不删除它
   -x 打印命令 并执行过它的
   -n 打印编译的命令但不执行他们
   -p n: 并行编译 其中 n 为并行的数量
   
   
   
go build  编译源码文件或代码包  

go install  编译并安装代码或者源码文件
查看执行文件:
ls $GOBIN  


go get 从远程代码仓库上下载安装代码包
下载到$GOPATH下 第一个文件的的 src文件夹中
  -d 只执行下载动作不执行安装动作
  -fix 下载后先执行修正动作 再进行编译安装
  -U 利用网络来更新已有的代码包及其依赖包
 

Import 操作:

  • 如果一个 main 导入其他包,包将被顺序导入
  • 如果导入的包依赖其他包(包 B),会首先导入 B 包,然后初始化 B 包中常量和变量,最后如果 B 包中有 init,会自动执行 init()
  • 如果包导入完成后对 main 中常量和变量进行初始化,执行 main 中的 init函数
  • 如果一个包被导入多次则该包只会被导入一次
  • import 别名 “.” “_”
别名:将导入的包命名为另一个容易记忆的别名
点操作: .标识的包导入后,调用该包中函数时可以省略前缀包名
下划线(_)操作: 导入该包,但不导入整个包,而是执行包中的 init 函数此无法通过包名来调用包中的其他函数
             使用下划线操作往往为了注册包中的引擎,让外部可以方便地使用

变量代码

  • 全局变量需要加上 var 方法体内则可以不用加上
  • 大写字母开头可以被包内其他文件导入,小写则不行

常量

  • 类型:显示 隐式
显式:const identifier [type] = value
隐式:const identifier = value (通常叫无类型常量)
常量可以使用内置表达式定义 : 例如 len() unsafe.Sizeof()
常量范围目前只支持布尔,数字,字符串

特殊常量 iota 使用

  • iota在 const 关键字出现时将被重置为0
  • const 中每新增一行常量声明将使 iota 计数一次
  • iota 常见用法
1. 跳值使用法
2. 插队使用法
3. 表达式隐式使用法
4. 单行使用法

编程

例子1 : Http:HelloWorld

package main

import (
	"fmt"
	"net/http"
)

func main()  {
	http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
		fmt.Fprint(writer,"Hello World! Mr.Sam赖")
	})
	http.ListenAndServe(":8989",nil)
}


访问: http://localhost:8989

例子2 : 多线程 + 线程间通信

package main

import "fmt"

func main() {

	ch :=make(chan string)

	for i:=0; i<10;i++  {
		go hello(i, ch)
	}

	for {
		msg :=<-ch
		fmt.Print(msg)
	}
	
}

func hello(i int,ch chan string) {
	for  {
		ch <- fmt.Sprintf("Hello World...%d \n ", i)
	}

}

例子3 : 数组的内部排序

package main

import (
	"fmt"
	"sort"
)

func main() {
	//排序
	arr:=[]int{45, 23, 6, 12, 1, 905, 16, 75}
	sort.Ints(arr)
	for _,val:=range arr {
		fmt.Println(val)
	}
}

例子4 : 单元测试操作

package main

import "testing"

/**
	1.文件名称必须以: _test 作为后缀
	2.忽略测试
	  t.SkipNow()
	3.执行指令: go test -v
	4.注意点:
      方法名称一定需要 : Test_xxxx 名称 Test 为首字母大写
	  方法体参数内容 : t *testing.T
	5.日志显示: t.Log()  t.Error()
 */

func TestRepeat(t *testing.T) {
	a :=repeat("a")
	t.Log("a 的值"+ a)
	k := "aaaaa"
	if a == k {
		t.Logf("测试成功,a 的值为 : %s",a)
	}

}

func TestPk(t *testing.T)  {
	t.Log( t.Name(),"开始执行 Pt 的内容")
	for i:=0;i< 9 ;i++  {
		repeat("a")
	}
}

func repeat(s string) string{
	var result string
	for i:=0; i<5 ;i++  {
		result+= "a"
	}
	return result
}


func TestAdd(t *testing.T)  {
	//忽略测试
	//t.SkipNow()
	t.Log(t.Name(), "Begin....")
	a := 2
	b := 3
	if add(a,b) != 5{
		t.Errorf("result   %d ",add(a, b))
	}
	t.Logf("a + b is  :  %d",add(a,b))
	t.Log(t.Name(), "end....")
}


func add(a,b int) int {
	return a + b
}


/**
 go test -v
 打印结果:
=== RUN   TestRepeat
--- PASS: TestRepeat (0.00s)
    lx_test.go:18: a 的值aaaaa
    lx_test.go:21: 测试成功,a 的值为 : aaaaa
=== RUN   TestPk
--- PASS: TestPk (0.00s)
    lx_test.go:27: TestPk 开始执行 Pt 的内容
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
    lx_test.go:45: TestAdd Begin....
    lx_test.go:51: a + b is  :  5
    lx_test.go:52: TestAdd end....
PASS
 */



例子5 : 基准测试

  • 参考链接 : http://c.biancheng.net/view/124.html
/**
	参考链接 : http://c.biancheng.net/view/124.html
	基准测试:
		1.一定需要方法名称 : Benchmark开头
		2.执行的指令:
          go test -v -bench=.
          go test -v -bench=. jz_test.go
          增加自定义时间:
          go test -v -bench=. -benchtime=5s jz_test.go

 */

func BenchmarkAdd(b *testing.B)  {
	var n int
	for i:=0;i<b.N;i++ {
		n++
	}
}

/**
执行:
	go test -v -bench=.
打印的内容:
goos: darwin
goarch: amd64
BenchmarkAdd-16         1000000000               0.238 ns/op
PASS

测试说明:
执行了: 1000000000 次
每次的操作时间: 0.238 ns
*/

附上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值