ubuntu下使用vscode开发golang程序,从控制台到简单web程序

news2024/12/24 8:13:31

最近项目要使用go语言开发一个web程序,由于是第一次使用go开发,就将开发过程中的点滴做个记录吧。

1.安装go

1.1 安装

Ubuntu下安装go语言开发运行环境有如下两种方法

(1)方法一:使用命令

sudo apt  install golang-go

(2)方法二:下载go程序包,解压就行

例如:

tar -zxvf go1.19.2.linux-amd64.tar.gz

我按照方法二进行安装,解压后目录结构如下:

目录

1.安装go

1.1 安装

1.2 配置go语言环境变量

2.vscode配置go开发

2.1安装go插件

2.2 Ctrl + Shift + P配置

2.3 创建launch.json配置文件

 2.4 设置断点调试

3.编译运行

4.控制台程序

5.http模块开发简单web应用

1.2 配置go语言环境变量

(1)GOPATH
说明:GOPATH 环境变量用来指定开发项目目录,其下一般会建立bin, pkg, src三个目录
(2)GOROOT
说明:GOROOT 用来指定 go 的安装路径
(3)GOBIN程序安装路径
说明:go install 安装应用程序的路径
(4)GOPROXY
说明:GOPROXY是用来设置go mod的代理,以英文逗号“,”分割,使Go在后续拉取模块版本时能够脱离传统的VCS方式从镜像站点快速拉取。它拥有一个默认:https://proxy.golang.org,direct,但proxy.golang.org在中国无法访问,所以建议使用goproxy.cn替代

例如在~/.bashrc中配置如下: 

export GOBIN=$HOME/go/bin
PATH=$PATH:$GOBIN:$HOME/go/go/bin
export PATH

export GOROOT=$HOME/go/go
export GOPATH=$HOME/go
export GOPROXY=https://goproxy.cn,direct

安装后可查看go版本:

go version

2.vscode配置go开发

2.1安装go插件

2.2 Ctrl + Shift + P配置

 

2.3 创建launch.json配置文件

内容如下:
 

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/first.go"
        }
    ]
}

 2.4 设置断点调试

调试成功:配置OK 

3.编译运行

golang运行方式有两种,一种是直接运行,另一种是编译成可执行程序,然后再运行,例如程序源文件为first.go,代码如下:

package main

import (
	"fmt"
)

func main() {
	fmt.Println(123, "hello world", 'A', 12.345)
}

(1) 直接运行

go run first.go  

(2) 编译再执行

go build first.go 

./first

(3) 安装程序到GOBIN

go install first.go 

4.控制台程序

如下代码演示各种变量控制台输出:

package main

import (
	"fmt"
	"math"
)

/*
Go语言的基本类型有:
bool
string
int、int8、int16、int32、int64
uint、uint8、uint16、uint32、uint64、uintptr
byte // uint8 的别名
rune // int32 的别名 代表一个 Unicode 码
float32、float64
complex64、complex128
*/

func showVar() {
	fmt.Println(123, "hello world", 'A', 12.345)
	fmt.Printf("%t %c %d %s %f %x %X\n", true, 'A', 123456, "hello go", math.Pi, 10, 12)
	//标准声明变量 var 变量名 变量类型
	var iInt int
	//初始化
	iInt = 110
	//声明并初始化
	var vs string = "声明并初始化"
	fmt.Println(iInt, vs)

	//批量格式
	var (
		a int
		b string
		c []float32
		d func() bool
		e struct {
			x int
		}
	)
	fmt.Println(a, b, c, d, e)

	//简短格式: 名字 := 表达式
	i, j := 0, 1
	fmt.Println(i, j)

	//编译器自动推到类型
	var it = 100
	var st = "hello"
	fmt.Println(it, st)

	// 格式化控制输出
	fmt.Printf("%f\n", math.Pi)
	fmt.Printf("%.2f\n", math.Pi)

	var vbt bool = true
	var vbf bool = false
	fmt.Println(vbt, vbf)
}

func showPtrVar() {
	var cat int = 1
	var str string = "today is wednesday"
	ptr := &cat
	fmt.Printf("%p %p %p \n", &cat, &str, ptr)

	// 打印ptr的类型
	fmt.Printf("ptr type: %T\n", ptr)
	// 对指针进行取值操作
	value := *ptr
	// 取值后的类型
	fmt.Printf("value type: %T\n", value)
	// 指针取值后就是指向变量的值
	fmt.Println("value : ", value)
	sPtr := &str
	fmt.Printf("sPtr type: %T\n", sPtr)
	values := *sPtr
	//打印字符串
	fmt.Printf("values: %s\n", values)
}

func swap1(a *int, b *int) {
	t := *a
	*a = *b
	*b = t
}

func swap2(a, b *int) {
	t := *a
	*a = *b
	*b = t
}

type Point struct {
	X int
	Y int
}

type Color struct {
	R, G, B byte
}

type Player struct {
	Name        string
	HealthPoint int
	MagicPoint  int
}

type Command struct {
	Name    string
	Ver     *int
	Comment string
}

// 函数封装实例初始化
func newCommandInstance(name string, varref *int, comment string) *Command {
	return &Command{
		Name:    name,
		Ver:     varref,
		Comment: comment,
	}
}

func useStruct() {
	/*
		type 类型名 struct {
		字段1 字段1类型
		字段2 字段2类型
		…
		}
	*/
	var p Point
	fmt.Println(p.X)
	p.X = 10
	p.Y = 20
	fmt.Println(p)

	//new关键字实例化
	zhangsan := new(Player)
	zhangsan.Name = "Canon"
	zhangsan.HealthPoint = 300
	fmt.Println(zhangsan)

	var version int = 1
	//取结构体的地址实例化
	cmd := &Command{}
	cmd.Name = "version"
	cmd.Ver = &version
	cmd.Comment = "show version"
	fmt.Println(cmd)

	version = 2
	cmd = newCommandInstance(
		"path",
		&version,
		"print file path",
	)
	fmt.Println(cmd, *cmd.Ver)
}

func main() {
	showVar()
	showPtrVar()
	var a, b int = 111, 222
	fmt.Println(a, b)
	swap1(&a, &b)
	fmt.Println(a, b)
	swap2(&a, &b)
	fmt.Println(a, b)
	useStruct()
}

运行结果如下:

5.http模块开发简单web应用

下面展示使用net/http开发简单的web服务,代码如下:

package main

import "net/http"

type helloHandler struct{}

func (m *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello world, this is my first golang programe !"))
}

func welcome(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Welcome to golang family !"))
}

func main() {
	/*
		http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
			w.Write([]byte("Hello world, this is my first golang programe"))
	    })
		http.ListenAndServe("127.0.0.1:8080", nil)
	*/
	a := helloHandler{}

	server := http.Server{
		Addr:    "127.0.0.1:8080",
		Handler: nil, // 对应DefaultServeMux路由
	}
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello world !"))
	})
	//使用http.Handle
	http.Handle("/hello", &a)
	http.Handle("/welcome1", http.HandlerFunc(welcome))
	//使用http.HandleFunc
	http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Go Home!"))
	})
	http.HandleFunc("/welcome2", welcome)
	server.ListenAndServe()
}

启动后程序会监听8080端口,打开浏览器显示如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天天刷 B站,了解他们的评论系统是如何设计的吗?

今天给大家分享 B站的评论系统的 组件化、平台化建设 通过持续演进架构设计,管理不断上升的系统复杂度,从而更好地满足各类用户的需求。 基础功能模块 评论的基础功能模块是相对稳定的。 1. 发布评论:支持无限盖楼回复。 2. 读取评论&am…

异步编程解决方案 Promise

1. 回调地狱 2. Promise 的使用 3. Promise 的状态 4. Promise 的结果 5. Promise 的 then 方法 6. Promise 的 catch 方法 7. 回调地狱的解决方案 1. 回调地狱 回调地狱: 在回调函数中嵌套回调函数 因为 ajax 请求是异步的,所以想要使用上一次请求的结果作为请求…

ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-BF53x 处理器上集成了一个实时时钟(RTC)模块,板卡上设计了一个专门用于 RTC 时钟源的晶体32.7…

如何修复错误:无法下载 metadata repo appstream

如何修复错误:无法下载 metadata repo appstream 如果您出于某种原因仍在积极使用CentOS 8,您可能在尝试更新系统或只是安装软件包时遇到以下错误。 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No …

Linux内存管理

平时我们说计算机的“计算”两个字,其实说的就是两方面,第一,进程和线程对于CPU的使用;第二,对于内存的管理。——这个是对计算机的理解的两个大方面,面试中问到的场景设计题可以尝试从这两个角度出发。 可…

Gradle学习笔记之项目生命周期及settings文件

文章目录Gradle项目的生命周期settings文件Gradle项目的生命周期 Gradle项目的生命周期分为初始化->配置->执行三步,如下图所示: 初始化阶段主要目的是初始化构建,分为执行初始化脚本和执行设置脚本两步,前者在每个项目构…

多线程的实现

目录 进程和线程 并发和并行 继承实现Runnable接口的Thread类实现的多线程 实现Runnable接口创建线程类 线程常用方法 进程和线程 进程:一个程序的启动就可以抽象化为一个进程 线程:线程是由进程开启的,一个进程可以创建多个线程&#x…

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

基于jsp+mysql+ssm项目bug修复管理系统-计算机毕业设计

项目介绍 本文主要是采用ssm的mvc技术、Mysql数据库、Tomcat服务器作为开发平台,系统采用B/S结构进行开发,完成一个项目修复管理系统,构建企业管理与员工任务计划相结合。提供了包括传统业务中最基本的用户注册、登录、查询、职位信息、部 门…

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动 1. 新主角登场 手上有块8x8LED点阵屏,咱们已经了解了点阵屏的基础电路与驱动原理,并用两片74HC595锁存IC成功驱动点阵屏显示需要的图案。 MicroPython-On-ESP8266…

DBCO-PEG-CHO,DBCO-CHO,二苯基环辛炔-聚乙二醇-醛基

一、理论分析: 中文名:二苯基环辛炔-聚乙二醇-胆固醇,胆固醇偶联二苯基环辛炔, 二苯基环辛炔-聚乙二醇-醛基,点击试剂DBCO偶联醛基 英文名:DBCO-PEG-CHO; DBCO-CHO 二、结构式: 三…

【JavaEE】B/S结构系统的会话机制_session机制

session机制什么是会话?session机制为什么需要session对象来保存会话状态呢?只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?为什么不使用request(ServletRequest)对象保存会话状态?为什么不使用appl…

【c++实战项目】——云备份服务器

项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上。并且随时可以通过浏览器进行查看并且下载,其中下载的过程支持断点续传。服务器上有热点管理模块,将非热点文件进行压缩存储,节省服务器的磁盘空间。服务器各个模块的功能介绍 配…

Python入门学习需要知道的100个小技巧,加了几个小时班终于整理出来了

Python新手需要知道的100个小技巧序言最后序言 哈喽兄弟们,今天给大家分享一下Python初学需要知道的100个小技巧~ 1、for循环中的else条件 这是一个for-else方法,循环遍历列表时使用else语句。下面举个例子,比如我们想检查一个列表中是否包…

DNSPod十问陈迪菲:从C到B,鹅厂设计师的中场战事

陈迪菲,腾讯云设计中心总经理,公司设计通道副会长,设计技术委员会委员,腾讯学院优秀讲师,曾于2019年获得新中国成立70周年中国用户体验设计70人提名奖。2010年加入腾讯,10年设计团队项目管理经验&#xff0…

C++手机运动信息管理系统

C手机运动信息管理系统 《程序设计基本能力综合实训》 实训案例名称:手机运动信息管理系统 -----说明文档 本案例主要完成手机运动信息的管理。主要功能包括:用户信息的管理、运动信息的管理、查看运动排行榜、定制运动路线、数据文件操作和退出。 如图 1-1 所示。 图1-1 …

web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

初始C语言2【函数 、数组、操作符、关键字、#define 定义常量和宏、指针、结构体】

目录 八、函数 九、数组 1、数组的定义:一组相同类型元素的集合 2、数组的下标 数组的每个元素都有一个下标,下标是从0开始的。 数组可以通过下标来访问元素。 3、数组的使用 十、操作符 1.常见操作符: 举例: 1&#xff…

与图相关的一些矩阵

目录前言正文邻接矩阵(Adjacency matrix)度矩阵(Degree matrix)关联矩阵(Incidence matrix)拉普拉斯矩阵常规拉普拉斯矩阵拉普拉斯矩阵标准化前言 以无向图为例,介绍与图相关的各种矩阵。我们定义下面的图为 GGG: import networkx as nx import matplo…

CSS之背景样式及边框样式

1、背景样式 常用属性: background-color:背景颜色background-image:背景图片background-repeat:背景图片的平铺方式background-position:背景图片的位置background-attachment:背景图随滚动条的移动方式 …