go环境设置和Goland安装

2022年3月18日 367点热度 0人点赞 0条评论

本篇笔记,也是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>,从下拉框中选择一下就好了。

图片

image-20220318120503229
  • GOPATH

    默认从环境变量中读取了。

图片

image-20220318120537879

这里,再提一下关于GOPATH,根据Goland官方文档介绍,有三种作用范围:

  • 全局 GOPATH:设置适用于特定安装的 GoLand 的所有项目(我们之前设置的都是这种全局的
  • Project GOPATH:设置仅适用于当前项目。
  • 模块 GOPATH:设置仅适用于一个模块。它们还可以承载特定的技术或框架。

图片

gopath三种设置范围

如果您指定了所有三个范围,GoLand 会首先选择最小的范围。比如模块级别的GOPATH设置。

  • GoModules设置

    设置了一个goproxy,为了防止包下载不下来,更改为国内代理。

    这里可选择有:goproxy.cn,direct ; goproxy.io,direct;还有一个默认的 proxy.golang.org,direct

图片

image-20220318165711833

到此,Goland也设置好了。下面,我们就来搞一个神级的入门示例吧~~

创建go项目,有很多种方式,比如通过命令go mod init hager.org/hello或者使用VScode+go插件、idea+go插件、Goland集成IDE。

选择你想用的工具即可。这里是Goland这种IDE环境来记录学习笔记的。

Goland新建GO modules

通过Goland,选择GO modules,然后选择好location,设置好Environment(可选)即可。

图片

image-20220318172024990

输出 hello word

创建一个Simple application,这样可以带一个默认的main()方法,也是该包的一个入口。

我们在main方法中,输入fmt.Println("hello world."),然后点击三角,即可运行。

图片

image-20220318125026225

到此,go版本的hello world,就完成了。你可以对别人吹牛P说,你又掌握了一门语言(hello world)~

多来一点点

接下来,我们深入一点点,比如定义结构体、序列化、指针等等,先来一个demo看看。知识点以后慢慢补~

图片

image-20220318131847528
  • 实体声明
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/

6710go环境设置和Goland安装

root

这个人很懒,什么都没留下

文章评论