quic-go的源码目录如下,在./quic-go下有多个文件夹和.go文件组成了quic-go的整体库。
//quic-go代码目录
/quic-go
|-- /example
|-- /fuzzing
|-- /http3
|-- /integrationtests
|-- /internal
|-- /interop
|-- /logging
|-- /metircs
|-- /alog
|-- /quicvarin
|-- /testutils
| |-- go.mod
| |-- interface.go
| |-- stream.go
|-- |--...
1. go.mod: 在./quic-go目录下有一个go.mod文件,这个文件定义了./quic-go下所有包所属的模块名称,这个名称在go.mod文件中的第一行。所以我们在引用quic-go库时,总是可以看到需要在开头引入这个模块名称,即import "github.com/quic-go/quic-go"。注意quic-go库只定义了这一个模块名称,即在./quic-go所有文件或者文件夹内都不包括子模块(其他的go.mod文件)
2. ./quic-go/*.go: 在./quic-go目录下还有许多.go文件,如stream.go,frame.go等。这些都是quic-go库的源码,定义的方法和类型可以被引用。例如在client.go中定义了DialAddr的方法,并且client.go中的第一行声明所属的包是quic。我们在其他文件中导入quic-go库后,就可以使用quic.DialAddr方法引用。
3. ./quic-go /* /*.go: 在./quic-go目录下还有许多文件夹如http3,同样其也组成quic-go库的一部分。如果我想在其他.go文件调用http3文件夹下定义的包http3,我需要这样引用import "github.com/quic-go/quic-go/http3"。因为这个http3包的定义在github.com/quic-go/quic-go模块名下一个叫http3的文件夹内。其他的子包也如此调用。
4. 不能调用的情况:在go语言中需要注意,以./quic-go/stream.go举例,stream.go第一行定义了该文件所定义的方法所属包的名字为quic。也就是说在其他.go文件,可以通过import "github.com/quic-go/quic-go"来调用stream.go中定义的方法。但是在go语言中,一个包中首字母小写的结构体类型或者函数是私有的不能够被其他文件调用,如stream.go中定义的type stream struct就是私有的不能够被其他文件通过quic.stream来调用。