golang이 패키지를 가져올 수 없는 문제에 대한 해결책:
패키지 가져오기:
표준 패키지는 "fmt", "net/http"와 같은 지정된 짧은 경로를 사용합니다.
자신의 패키지, 패키지를 가져오려면 작업 디렉터리(GOPATH) 아래에 디렉터리를 지정해야 합니다. 이는 실제로 작업 디렉터리를 기반으로 하는 폴더 디렉터리입니다.
패키지를 가져오는 방법은 다양합니다.
$GOPATH/src 디렉터리 가져오기 import "test/lib"
(실제로 경로는 $GOPATH/src/test/lib)
$GOPATH/src
目录导入import "test/lib"
(路径其实是$GOPATH/src/test/lib)
别名导入:import alias_name "test/lib"
,这样使用的时候,可以直接使用别名
使用点号导入:import . "test/lib"
,作用是使用的时候直接省略包名
使用下划线导入:improt _ "test/lib",该操作其实只是引入该包。当导入一个包时,它所有的init()函数就会被执行,但有些时候并非真的需要使用这些包,仅仅是希望它的init()函数被执行而已。这个时候就可以使用_操作引用该包。即使用_操作引用包是无法通过包名来调用包中的导出函数,而是只是为了简单的调用其init函数()。
往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用,例如实现database/sql的包,在init函数里面都是调用了sql.Register(name string, driver driver.Driver)
注册自己,然后外部就可以使用了。
相对路径导入import"./model"//
当前文件同一目录的model目录,但是不建议这种方式import
包的导入过程说明:
程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。
当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:
注意:
import导入Go包有几种方式,用途不同。 代码统一存储在工作目录下,工作目录里边会有很多个包,不同包按目录组织,包下面由多个代码文件组成。导入包时按包的唯一路径进行导入,导入的包默认是必须要使用,如果不使用则编译失败,需要移除,减少不必要代码的引入,当然还有其他使用场景。默认情况下,我们使用文件名做为包名,方便理解。不同包组织不同的功能实现,方便理解。
编译时使用的是包源码还是.a?
一个非main包在编译后会生成一个.a
文件(在临时目录下生成,除非使用go install安装到$GOROOT
或$GOPATH
下,否则你看不到.a),用于后续可执行程序链接使用。比如Go标准库中的包对应的源码部分路径在:$GOROOT/src
,而标准库中包编译后的.a文件路径在$GOROOT/pkg/darwin_amd64
下。一个奇怪的问题在我脑袋中升腾起来,编译时,编译器到底用的是.a还是源码?
在使用第三方包的时候,当源码和.a均已安装的情况下,编译器链接的是源码。而所谓的使用第三方包源码,实际上是链接了以该最新源码编译的临时目录下的.a
import alias_name "test/lib"
, 이런 방식으로 사용하면 별칭을 직접 사용할 수 있습니다
import "test/lib. "
, 직접 사용하는 기능입니다. 패키지 이름 을 생략하고 밑줄을 사용하여 가져옵니다: import _ "test/lib". 이 작업은 실제로 패키지를 가져옵니다. 패키지를 가져오면 해당 패키지의 모든 init() 함수가 실행되지만 때로는 이러한 패키지를 실제로 사용할 필요가 없고 init() 함수만 실행되기를 원할 때도 있습니다. 이때 _ 오퍼레이션을 이용하여 패키지를 참조할 수 있습니다. _ 연산을 사용하여 패키지를 참조하더라도 패키지 이름을 통해 패키지에 내보낸 함수를 호출할 수 없고 단순히 해당 init 함수()를 호출하면 됩니다.
sql.Register(이름 문자열, 드라이버 드라이버)를 호출합니다. ..Driver)
직접 등록하시면 외부에서 사용하실 수 있습니다. 상대 경로 가져오기 import "./model"//
모델 디렉터리는 현재 파일과 동일한 디렉터리에 있지만 이 가져오기 방법은 권장되지 않습니다🎜🎜🎜가져오기 프로세스 지침 package: 🎜 🎜🎜 프로그램 초기화와 실행 모두 메인 패키지에서 시작됩니다. 기본 패키지가 다른 패키지도 가져오는 경우 컴파일하는 동안 순서대로 가져옵니다. 때로는 여러 패키지에서 동시에 패키지를 가져오기 때문에 한 번만 가져옵니다. 예를 들어 많은 패키지가 fmt 패키지를 사용할 수 있지만 여러 패키지를 가져올 필요가 없기 때문에 한 번만 가져옵니다. 타임스). 🎜🎜패키지를 가져올 때 해당 패키지가 다른 패키지도 가져오는 경우 다른 패키지를 먼저 가져온 다음 해당 패키지의 패키지 수준 상수 및 변수가 초기화된 다음 init 함수가 실행됩니다(해당되는 경우). 임의) 등이 있습니다. 가져온 패키지가 모두 로드된 후 메인 패키지의 패키지 수준 상수 및 변수가 초기화되고 메인 패키지의 init 함수가 실행되고(존재하는 경우) 마지막으로 메인 함수가 실행됩니다. 다음 그림은 전체 실행 과정을 자세히 설명합니다. 🎜🎜🎜🎜참고: 🎜🎜Go 패키지를 가져오는 방법에는 다양한 용도가 있습니다. 코드는 작업 디렉터리에 균일하게 저장됩니다. 작업 디렉터리에는 다양한 패키지가 디렉터리별로 구성되며 패키지는 여러 코드 파일로 구성됩니다. 패키지를 임포트할 때에는 해당 패키지의 고유 경로에 따라 임포트해야 하며, 반드시 임포트된 패키지를 사용하지 않으면 불필요한 코드 도입을 줄이기 위해 컴파일이 실패하게 되므로 제거해야 합니다. , 다른 사용 시나리오가 있습니다. 기본적으로 이해하기 쉽도록 파일 이름을 패키지 이름으로 사용합니다. 다양한 패키지는 이해를 돕기 위해 다양한 기능 구현을 구성합니다. 🎜🎜🎜컴파일할 때 패키지 소스코드나 .a를 사용하셨나요? 🎜🎜🎜 기본 패키지가 아닌 패키지는 컴파일 후 .a
파일을 생성합니다($GOROOT
또는 $에 설치하지 않는 한 임시 디렉터리에 생성됨). GOPATH
아래에 설치하세요. 그렇지 않으면 후속 실행 프로그램 연결에 사용되는 a)가 표시되지 않습니다. 예를 들어 Go 표준 라이브러리의 패키지에 해당하는 소스 코드 경로는 $GOROOT/src
이고, 표준 라이브러리의 패키지의 컴파일된 .a 파일 경로는 입니다. $GOROOT/pkg/darwin_amd64 code> 다음. 이상한 질문이 머릿속에 떠오릅니다. 컴파일할 때 컴파일러는 .a를 사용합니까, 아니면 소스 코드를 사용합니까? 🎜🎜🎜🎜타사 패키지를 사용할 때 소스 코드와 .a가 모두 설치되면 컴파일러가 소스 코드에 연결됩니다. 소위 타사 패키지 소스 코드 사용은 실제로 최신 소스 코드로 컴파일된 임시 디렉터리에 있는 <code>.a
파일에 대한 링크입니다. 🎜🎜🎜🎜 Go 표준 라이브러리의 패키지도 이런가요? fmt와 같은 표준 라이브러리의 경우 컴파일할 때 $GOROOT/src 아래의 소스 코드를 사용해야 할까요, 아니면 $GOROOT/pkg 아래의 컴파일된 .a를 사용해야 할까요? 그러나 사용자 정의 패키지와 달리 (GO 설치 패키지를 다시 컴파일하지 않고) fmt 패키지의 소스 코드를 수정하더라도 사용자 소스 코드가 컴파일되면 fmt 패키지를 다시 컴파일하려는 시도가 없으며 링크는 여전히 유지됩니다. fmt.a🎜🎜🎜🎜🎜Go 언어에서는 가져온 후 경로의 마지막 요소가 패키지 이름인가요, 아니면 경로 이름인가요? 🎜🎜🎜🎜🎜가져오기 후 마지막 요소는 패키지 이름이 아닌 디렉터리인 경로여야 합니다. 그런데 경로명이 패키지명과 같은 경우가 많습니다🎜
import m "lib/math" m은 lib/math 경로에 있는 유일한 패키지를 나타냅니다. 컴파일러가 이 경로에서 두 개의 패키지를 찾으면 허용되지 않으며 컴파일 오류가 보고됩니다.
권장됩니다. 튜토리얼: "go 언어 튜토리얼"
위 내용은 golang이 패키지를 가져올 수 없으면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!