昨天看了这,看的很是懵逼
https://github.com/Unknwon/th...

当前目录下(examples/chapter_9/book/)有一个名为 package_test.go 的程序, 它使用了自定义包 pack1 中 pack1.go 的代码。这段程序(连同编译链接生成的 pack1.a)存放在当前目录下一个名为 pack1 的文件夹下。所以链接器将包的对象和主程序对象链接在一起。

示例 9.4 pack1.go:

package pack1
var Pack1Int int = 42
var PackFloat = 3.14

func ReturnStr() string {
    return "Hello main!"
}

它包含了一个整型变量 Pack1Int 和一个返回字符串的函数 ReturnStr。这段程序在运行时不做任何的事情,因为它不包含有一个 main 函数。

在主程序 package_test.go 中这个包通过声明的方式被导入

import "./pack1/pack1"

示例 9.5 package_test.go:

package main

import (
    "fmt"
    "./pack1/pack1"
)

func main() {
    var test1 string
    test1 = pack1.ReturnStr()
    fmt.Printf("ReturnStr from package1: %s\n", test1)
    fmt.Printf("Integer from package1: %d\n", pack1.Pack1Int)
    // fmt.Printf("Float from package1: %f\n", pack1.pack1Float)
}  

路径是这样的

.
├── book_main
│   ├── book_main
│   └── main.go
├── pack1
│   └── pack1.go
└── package_test.go

我只有像下面说的那样

如果包 pack1 和我们的程序在同一路径下,我们可以通过 "import ./pack1" 这样的方式来引入,但这不被视为一个好的方法。

才可以正常的go run/go test

或者不改import那,在pack1里再建一个pack1并把pack1.go移进去

.
├── book_main
│   ├── book_main
│   └── main.go
├── pack1
│   └── pack1
│       └── pack1.go
└── package_test.go

现在是想就"./pack1/pack1"这样如何正常运行

那个book_main里的main.go是可以正常build的,那里面的book_main是我之前已经试过go build之后

package main

import (
        "book/pack1"
        "fmt"
)

func main() {
        var test1 string
        test1 = pack1.ReturnStr()
        fmt.Printf("ReturnStr from package1: %s\n", test1)
        fmt.Printf("Integer from package1: %d\n", pack1.Pack1Int)
        //fmt.Printf("Float from package1: %f\n", pack1.pack1Float)
}

我的环境变量是这样

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

因为是用apt install安装的,我go get了网上的一个项目后就在$HOME里多了个go目录里面有bin和src,所以就直接把GOPATH设成这样了

我目前的认知就是导入的包就是最后斜杠后的那个,所以./pack1就是导入了pack1包,

一个应用程序可以包含不同的包,而且即使你只使用 main 包也不必把所有的代码都写在一个巨大的文件里:你可以用一些较小的文件,并且在每个文件非注释的第一行都使用 package main 来指明这些文件都属于 main 包。

而像上面引用说的那样,pack1下的所有.go不必都放在一个文件里,只需要第一行用package pack1
但他这个./pack1/pack1实在是不明了,而且里面好几个示例都是这样

.
├── dlinked_list.go
├── even
│   └── even.go
├── fibo
│   └── fibonacci.go
├── greetings
│   └── greetings.go
├── main_fibo.go
├── main_greetings.go
├── main_oddeven.go
└── size_int.go

main_fibo.go

import (
        "./fibo/fibo"
        "fmt"
)

main_oddeven.go

import (
        "./even/even"
        "fmt"
)

main_greetings.go

import (
        "./greetings/greetings"
        "fmt"
)

我不知道这样写到底怎样运行,就说不移动代码和改动那import那里,到底这样写怎样才能成功运行

又看了这个我怀疑这是不是以前的写法,毕竟这教程是旧的
https://github.com/Unknwon/th...

main.go

import (
    "fmt"
    "./struct_pack/structPack"
)
├── main.go
├── struct_pack
│   └── structPack.go

这导入包就好像用的是文件名一样,而其实只要./struct_pack就可以了