分类 - golang

2020-01-10 16:42:05    601    0    0

我希望在项目中引用本地的另外一个项目中的代码
结构如下
module mode1.com/mode1
文件结构

  1. gomode1
  2. apkg
  3. apkg.go
  4. bpkg
  5. bpkg.go
  6. go.mod

其中apkg.go 的内容为

  1. package apkg
  2. import "fmt"
  3. func Hello(){
  4. fmt.Println(" apkg 's hello\n")
  5. }

bpkg.go 的内容为

  1. package bpkg
  2. import apkg "mode1.com/mode1/apkg"
  3. import "fmt"
  4. func Test(){
  5. fmt.Println("this is Test\n")
  6. apkg.Hello()
  7. }

然后看另外一个包gomode2
文件结构
gomode2
main.go
go.mod

其中main.go 的内容为

  1. package main
  2. import "github.com/mode1/bpkg"
  3. func main(){
  4. bpkg.Test()
  5. }

我的go.mod 内容为

  1. module gomode2
  2. go 1.13
  3. require github.com/mode1 v0.0.0-incompatible
  4. replace github.com/mode1 => ../gomode1

可以看到我已经把对github.com/mode1 的引用替换成了

  1. ../gomode1

在编译的时候报错

  1. build gomode2: cannot load mode1.com/mode1/apkg: cannot find module providing package mode1.com/mode1/apkg

可以看到他说他找不到包 mode1.com/mode1/apkg
这个代码是在 bpkg.go 中引入的

问题的根本就是,当我们在引入一个包的时候,编译时会把他所有引入的包A、以及A中引入其他包的import语句都原样执行,
但是他不是跳转到对应的路径执行,而是在当前路径执行,这就出问题了

mode1.com/m

2017-12-13 20:37:45    256    0    0

一、认识Go
1、贝尔实验室---》谷歌
2、Go语言特性
2.1:自动垃圾回收
*手动管理内存的两个缺点
*自动垃圾回收算法(Garbage Collention)简称GC
2.2:更加丰富的内置类型
*常规内置类型
*数组、字符串
*map
*数组切片--Slice
2.3:函数多返回值:没有多返回值,结构体整体返回 参数址传递
2.4:错误处理
*三个关键字针对各种错误处理
*defer
*panic
*recover
2.5: 匿名函数和闭包
*Go语言中,函数也是值类型,可以作为参数进行传递
*匿名函数
2.6:类型和接口
*Go语言不支持继承和重载,只支持基本的类型组合
*把接口和类型进行分离,避免他们之间的相互的影响
2.7:并发编程
*goroutine
*协程
*channel
2.8;反射
*暂时没弄明白
2.9:语言之间的交互性
*Cgo和C语言之间的交互性
3、Go程序解读
3.1:package关键字表明当前所属的包的名称,包是Go程序最进本的分发的单位、
3.2:main函数是程序的入口,该函数不能带参数也不能有返回值
3.3:import:用于导入该程序需要的包,不能导入没有使用的包,会报错
3.4:func:关键字用于定义一个函数、
3.5:代码注释:行注释:// 块注释:/*............*/
3.6:Go语言函数的左花边括号一定需要和函数名称在同一行


4、工程管理
4.1、Go语言的编译是不需要复杂的Makefile的,只需要go build + 目标名称
4.2、如果在主package模块中引入其他的模块的时候,需要注意其他的模块的文件夹需要和模块名称相同
4.3、编译的目标名称其实是一个包名,注意所有的包都是放在src下的文件夹,然后文件夹下面存放该包的相关的函数


5、问题追踪和调试
5.1、日志打印
*fmt.Printf(fmt,......);用来格式化打印输出
*fmt.Println();没有格式化,直接进行输出
5.2、GDB调试
*Go编译生成的文件不需要在编译的时加入任何的编译选项,原生就支持GDB调试


二、顺序编程
1、变量
1.1、变量声明
*使用关键字var声明一个变量,格式: var 变量名 类型==》var number int;
*使用var 可以一次性声明多个相同类型的变量: var a,b,c in

2017-06-08 11:24:26    147    0    0

程序结构

命名

    关键字:go语言内部和其他的语言一样具有一些关键字,在程序的内部起到特殊的含义,命名一个函数或者是变量的时候不能和这些关键字重复

    内建名称:除了上面的这些关键字意外,还有一些是有特殊意义的内建的名称

    变量作用域

    go语言的作用域和其他的语言的作用域差不读,在函数的内部定义的变量就是局部的变量,只在该函数的内部使用

    定义在函数外部的变量标识可以在当前的文件中使用,也就是全局的变量

    对于全局变量:首字母大写表示可以被其他的文件引用,小写则只可以在该文件中使用

    推荐使用驼峰式命名:在go 语言中推荐使用驼峰式对函数和变量或者其他的变量命名

 

声明

变量声明

1、go中的变量的声明和其他语言不同的是把变量的类型放在变量的后面

2、使用关键字var表示对一个变量的声明

var  num int//声明一个int类型的变量num

3、在不同的位置声明的变量的作用域和声明周期也不同,在函数的内部定义的变量的声明周期在函数内部,并且作用域也在函数的内部

4、在函数外部声明的变量的作用域在相同package下的所有文件中都是可以直接使用的

 

常量声明

1、go中的常量的声明使用关键字const 

2、常量存储在静态存储区,不可修改

const num  int=10

 

类型声明

1、go的类型声明使用关键字type

函数声明

1、函数声明使用关键字func 

 

变量

1、变量声明和初始化

变量的声明格式;  var  变量名称  类型=初始化表达式,比如: var  num  int  = 12

其中 类型 和  =初始化表达式 其中的一个可以省略,如果省略类型则根据初始值自动的判断变量的类型,如果初始化表达式省略,则使用默认的初始化值

整数类型的默认初始化为0

布尔类型的默认初始化为false

string类型的默认的初始化为空的字符串

 

2、变量的初始化:初始化列表

在变量声明的时候进行初始化是比较好的,go支持多种方式的初始化方式

var  num  int = 12
var  num1,num2,num3 = 1,2,3
var  num1,num2 = func_test()//其中func_test有两个返回值

需要注意的是Go语言中不存在没有初始化的变量,即时你没有进行初始化,则有默认的初始化数值代替

 

3、变量初始化执行期

对于在包一级别定义的变量在main函数执行