本篇笔记,也是go开篇,主要介绍go在windows下的环境配置,以及Goland这种神级IDE的开发配置,非常简单。
高手,可以忽略。
资源
下载GO 1.18 https://golang.google.cn/dl/
下载GoLand https://www.jetbrains.com/go/download/other.html
系统 windows 10
安装
将上述资源,找到你想用的版本,下载安装即可。安装时没啥可说的,基本都是一路点点点。我们后面主要搞清楚的是环境变量中几个设置项,以及IDE的设置。
GO环境设置
-
配置环境变量 -
GOPATH:就是以后你代码存放位置,以及依赖包源码存放位置。比如 E:\study.workspace\go-workspace
-
GOROOT:就是go安装文件的位置,比如 D:\Program Files\Go
-
将 %GOPATH%\bin
,加入path中,以后其他编译包可以直接引用 --- tips 暂未验证
安装完后,可以在cmd命令行中,输入 go version
验证是否成功。
到此,go环境已经设置完整了。
扩展
国内因为一些原因,下载包很慢。此时,可以通过proxy进行代理设置。你可以通过 go env
查看,默认的环境配置:
C:\Users\Administrato>go env
# 这里高版本的go,建议使用module模式开发,这里可以设置为on,其他值还有auto、off,具体代表含义从网上可以了解下
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOOS=windows
# 这里就是上面配置环境变量指定的代码存放位置
set GOPATH=E:\study.workspace\go-workspace
set GOPRIVATE=
# 代理,一般使用两个,goproxy.cn,direct 或者官方的goproxy.io,direct、proxy.golang.org,direct
set GOPROXY=https://goproxy.cn,direct
set GOROOT=D:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18
GO111MODULE:官方说1.17版本将移除。是否使用模块支持的变量,如果设为off ,代表无模块支持,import的包会从gopath下寻找。当GO111MODULE=on时,即使没有 go.mod ,go 命令现在仍以模块感知模式(module-aware mode)构建包。
如果想修改,可以通过命令
go env -w GO111MODULE=on
打开。
GOPATH:后续也有可能会被移除。目前官方主推的是GO module模式。
GOPROXY:下载代理,国外的比较慢,配置为国内的即可起到加速效果。
go env -w GOPROXY=https://goproxy.cn,direct
简析Golang的依赖管理
知其然还要知其所以然,我在网上也看过一些关于GOPATH,GOROOT,go module的解析,但感觉说的比较散,这也是我写这篇文章的原因。一方面,希望大家可以通过这篇文章能够进一步了解Golang的依赖管理,另一方面我自己也可以进一步总结我看到的资料。
Golang的依赖管理,经历了三个阶段,最初就是使用GOPATH,这也是大部分教程会让你配置GOPATH的原因。当时官方建议只有一个GOPATH,大家把项目都放到GOPATH下,而且GOPATH下需要src,bin,pkg三个文件夹,src用来放源码,bin目录用来放编译好好的可执行文件,pkg用来放编译过后引用的第三方包。
如果你用go get命令下载第三方包,那么会下载到src目录下,引用的时候,golang解释器会去GOROOT和GOPATH的src下找。
但这样做显然有问题,如果项目A和项目B都在GOPATH下,同时都引用了第三方包C,但一个引用C1.0版本,一个引用了C2.0版本,按照这种情况,ABC都在src目录下,如何区分C的版本呢?
为了解决这个问题,Golang的依赖管理出现了第二个阶段,使用vendor目录。在各自的项目下创建一个vendor目录,将第三方依赖放到vendor目录下,解释器也会优先去找vendor目录下的第三方包,这样就可以解决问题。常用的一些第三方依赖包,也就是用来管理vendor的。这个关系就很像pip之于python,maven之于java。但这仍然无法解决很难用的GOPATH。
好在官方意识到了这个问题,也就到了第三个阶段,使用go module。使用go module已经完全不依赖于GOPATH了,可以说完美解决了解决第三方依赖的问题,而且很多Golang的项目也在往go module迁移。
当然最大的网络问题,也有GOPROXY帮我们解决,google可算为Golang操碎了心,希望Golang以后可以越来越火
版权声明:本文为CSDN博主「heheyixiao233」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/heheyixiao233/article/details/108296505
Goland配置
-
GOROOT
从环境变量中读取,如果默认
<No SDK>
,从下拉框中选择一下就好了。
-
GOPATH
默认从环境变量中读取了。
这里,再提一下关于GOPATH,根据Goland官方文档介绍,有三种作用范围:
-
全局 GOPATH:设置适用于特定安装的 GoLand 的所有项目(我们之前设置的都是这种全局的) -
Project GOPATH:设置仅适用于当前项目。 -
模块 GOPATH:设置仅适用于一个模块。它们还可以承载特定的技术或框架。
如果您指定了所有三个范围,GoLand 会首先选择最小的范围。比如模块级别的GOPATH设置。
-
GoModules设置
设置了一个goproxy,为了防止包下载不下来,更改为国内代理。
这里可选择有:
goproxy.cn,direct
;goproxy.io,direct
;还有一个默认的proxy.golang.org,direct
到此,Goland也设置好了。下面,我们就来搞一个神级的入门示例吧~~
创建go项目,有很多种方式,比如通过命令go mod init hager.org/hello
或者使用VScode+go插件、idea+go插件、Goland集成IDE。
选择你想用的工具即可。这里是Goland这种IDE环境来记录学习笔记的。
Goland新建GO modules
通过Goland,选择GO modules,然后选择好location,设置好Environment(可选)即可。
输出 hello word
创建一个Simple application,这样可以带一个默认的main()方法,也是该包的一个入口。
我们在main方法中,输入fmt.Println("hello world.")
,然后点击三角,即可运行。
到此,go版本的hello world,就完成了。你可以对别人吹牛P说,你又掌握了一门语言(hello world)~
多来一点点
接下来,我们深入一点点,比如定义结构体、序列化、指针等等,先来一个demo看看。知识点以后慢慢补~
-
实体声明
package user
// StudentModel 结构定义
type StudentModel struct {
UserId int32 `json:"user_id"` // 后面的是指定在json序列化时输出的属性名称
UserName string `json:"user_name"` // 后面的是指定在json序列化时输出的属性名称
Sex int `json:"-"` // json 序列化时,忽略
}
-
json输出 -
主要用到了 json
序列化相关方法 -
& 和 * 的区别 -
&
是取地址符号 , 即取得某个变量的地址 -
*
是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值
package main
import (
"encoding/json"
"fmt"
"hello/user"
)
func main() {
fmt.Println("hello world.")
// 引用其他包的结构体
// & 是取地址符号 , 即取得某个变量的地址
// * 是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值
var studentInfo = &user.StudentModel{UserId: 9527, UserName: "唐伯虎~", Sex: 1}
fmt.Println(*studentInfo) // 存储的值 {9527 唐伯虎~}
fmt.Println(&studentInfo) // 存储的地址 0xc0000d0020
fmt.Println(studentInfo) // 存储的值 &{9527 唐伯虎~}
studentInfo2 := user.StudentModel{UserId: 9528, UserName: "唐伯虎~", Sex: 1}
fmt.Println(studentInfo2) // 存储的值 {9528 唐伯虎~}
// 改变对象属性值
studentInfo2.UserId = 123456
marshal, err := json.Marshal(studentInfo2)
if err != nil {
fmt.Printf("转换失败,%s\n", err)
} else {
fmt.Println(string(marshal)) // {"user_id":123456,"user_name":"唐伯虎~"}
}
}
输出:
hello world.
{9527 唐伯虎~ 1}
0xc000006030
&{9527 唐伯虎~ 1}
{9528 唐伯虎~ 1}
{"user_id":123456,"user_name":"唐伯虎~"}
关于[多来一点点],这块涉及到的东西,对于仅仅写了一个helloworld的我来说,也是有很多知识缺失。不过,没关系,我们后面的笔记中,将会逐步补齐这部分知识点。
资料
Goland官方文档:https://www.jetbrains.com/help/go/quick-start-guide-goland.html#open-project
Go 官方文档:https://golang.google.cn/doc/
文章评论