go 多模块代码依赖调用

go 书写被依赖模块的代码

目录结构如下

image-20221006182224250

代码
package greetings
import "fmt"

func Hello(name string)string{
      message:=fmt.Sprintf("Hi,%v. welcome!",name);
      return message;
}

书写调用端代码

入目结构如下

image-20221006182355039

代码
package main
import (
      "fmt"
      //引入依赖
      "example.com/greetings"
)
func main(){
     fmt.Println(greetins.Hello("fpp"))
}
疑问
这样能否调用成功呢?看执行结果

image-20221006182553899

看提示说是找不到依赖 说明这样引入依赖还不行

个人猜测: go是通过 go.mod来管理依赖的 如果没有在这里声明是找不到依赖的。

正确的方式:

将模块当中的目录路由到本地文件系统目录 这个应该是告诉go所依赖的 go.mod和go代码在哪里

go mod edit -replace example.com/greetings=…/greetings

执行完成之后 go.mod文件产生如下变化 多了一行

image-20221006185702661

此时还不能起作用 还需要使用 go mode dity 同步一下 从go的体系当中真正的拿到依赖

执行完成之后 go.mod文件产生如下变化 多了一行

image-20221006190210029

由版本号和 一串数字 这个数字应该是一个地址或者索引(在go语言体系当中)

官网说

使用这个命令是 发现所依赖的代码,并且在hello.go中使用导入这个这个包时,依赖就会被创建

查看执行结果 成功执行

image-20221006185610023

如果在同一个目录下能找到依赖吗?或者需要导入包吗

同目录下的不是 main函数的go 代码怎么写呢?

我猜测 应该和同目录声明的目录一致,猜测根据是同目录下只能有一个mod文件 所以同目录下的go

应该只能使用已声明的module example.com/hello

验证一下

代码

package hello
import "fmt"

func Hello(name string)string{
    message:=fmt.Sprintlf("hi %v welcome",name);
    return message;
}}

那 hello.go 怎么去引用当前目录下的代码呢?

猜测不用导入 直接使用 代码如下

package main
import (
      "fmt"
)
func main(){
     fmt.Println(Hello("fpp"))
}

发现不行 报错了 找不到Hello这个方法

image-20221006191552055

修改一下代码试试

package main
import (
      "fmt"
      "example.com/hello"
)
func main(){
     fmt.Println(Hello("fpp"))
}

发现还是不行

image-20221006191840539

再猜是不是 test.go不用写package hello这个 修改一下代码试试

test.go如下

import "fmt"

func Hello(name string)string{
    message:=fmt.Sprintlf("hi %v welcome",name);
    return message;
}

发现也不行 难道只能 package main吗修改一下代码试试

test.go如下

package main
import "fmt"

func Hello(name string)string{
    message:=fmt.Sprintlf("hi %v welcome",name);
    return message;
}}

hello.go如下

package main
import (
      "fmt"
)
func main(){
     fmt.Println(Hello("fpp"))
}

还是不行咋回事呢?难道是hello.go 中要用 test.Hello才能获取到 修改一下代码试试

hello.go如下

package main
import (
      "fmt"
)
func main(){
     fmt.Println(test.Hello("fpp"))
}

发现这种方式才能运行

image-20221006194123718

也就是说得两个文件一起跑 上面运行方式,编译器并不把两个文件当一个包运行

代码如下

test.go

package main
import "fmt"

func Hello(name string)string{
    message:=fmt.Sprintlf("hi %v welcome",name);
    return message;
}

hello.go

package main
import (
      "fmt"
)
func main(){
     fmt.Println(Hello("fpp"))
}

总结

  1. 不同目录下的模块要想引用 必须要在mod文件当中建立引用

    1. 使用 go mod edit --replace 声明包的路由
    2. 使用 go mod dity 建立真正的依赖 能够使用
  2. 相同目录下的模块要想引用 运行时得带上所依赖的文件 类似 这样 go run hello.go test.go 或者设置成工程目录,也可以运行 这个工程目录后面再探究

  3. 相同目录下的 go文件 package必须一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值