几年前学习编程语言,总是先学习其基本类型,if-else for while switch 等语句以及 print,对于代码复用,类似 java 的 import 等,基本放在最后,以求快速入门,现在学习编程语言,首先看的是包管理相关怎么玩,if 等其实大家都差不多。
我们不妨列下 java 有那些是我们平时是使用最多的,我觉得,自下而上主要有以下几方面:
1、数据类型的声明与使用,比如 int、string 等;
2、基本输入输出,比如 scann 与 print
3、函数的使用,private public 等修饰词;
4、类的声明,接口与实现,多态,枚举,泛型;
5、代码复用,引用别的包的代码;
掌握以上能力,java 也算是入门了,其他编程语言,可能有很多特性与优势,但是最核心的这些能力和 java 其实差不多,我相信 go 也是如此,而我决定自上而下的学习,即先看包管理,再看类、接口与实现、泛型、枚举等,我们来看,我的第一个 go 项目。
package main
import (
"fmt"
"kpromise/person"
)
func main() {
var name1, age = person.Name("test", 12)
fmt.Println(name1)
fmt.Println(age)
}
这里 import 部分的 fmt 是 go 内置的模块,第二个 kpromise/person 是我自定义的模块名/包名,即 go import 的格式是:模块名/包名,模块名由 go.mod 文件指定,值得注意的是,该文件仅对其当前目录下的子目录生效,当前目录下的 .go 文件并不生效,另外,当有多个 go.mod 文件时,其是互相独立的,假设有文件夹: /A/B/C/D 当 B、C 下无 go.mod 时,A 下面的 go.mod 对 B、C、D 极其子目录下的 go 文件均有效,假设 C 下也有 go.mod 文件,则 A 下面的 go.mod 仅对 B、C 目录下的 go 文件有效,C 下面的 go.mod 仅对 D 目录下的 go 文件有效。
java 是没有模块这个概念的,至少 java 8是这样,java 直接使用包名即可,且包名必须和路径一致,go 没这个限制,但是 go 的 main 这个包名比较特殊,main 包名下的 main 方法类似 java 的 main 方法,不同的是,go 限制了包名和函数名,必须均为 main、main 才可以,而 java 则仅限制函数名。
回过头来,我们看下,java 的 import 和 go 有何区别?
首先,java import 的是包名,包名必须和路径名称一致,go 不这样限制,包名你可以随意叫,但是同一个目录下,包名必须一致,这样看,go 的 import 和 java 并无区别,go 的模块名可以看做是包名的前缀,go 中 import 模块名/包名 可以看做是 java 的 import 包名.类名.* 不过,我们知道,java 还可以 import 某个静态的常量、变量或者方法,go 目前还没看到这块,即 如果有 class,go 如何仅 import 这个 class 而不是整个包?或者仅 import 某个类下的某个方法?
评论