golang入门记录

news2024/11/28 16:42:42

参考:
https://www.runoob.com/go/go-tutorial.html
https://zhuanlan.zhihu.com/p/63310903

下载安装包:
windows:https://dl.google.com/go/go1.20.2.windows-amd64.msi

对基础设施,包括跨操作系统、网络、多线程,web、cli都比较好用

Go 语言从发布 1.0 版本以来备受众多开发者关注并得到广泛使用,Go 语言的简单、高效、并发特性吸引了众多传统语言开发者的加入,而且人数越来越多。

作用

鉴于Go语言的特点和设计的初衷,

Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;

网络编程方面,Go语言广泛应用于Web 应用、API应用、下载应用等;

除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。

  • 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
    分布式系统、数据库代理器、中间件等,例如Etcd。
  • 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
  • 数据库操作
    开发云平台,目前国外很多云平台在采用Go开发

开始使用

hello world

package main

//import 语句中并不是引入目录,而是引入指定包的 path
import "fmt"

//fmt包 包括了 格式化文本,打印到康之泰

import "fmt"
//运行main包时自动执行main函数

func main() {
    fmt.Println("Hello, World!")
}

使用第三方包

找包:https://pkg.go.dev/

go mod init go_test

go mod init 是 Go Modules 的命令之一,它的作用是将当前目录初始化为一个新的 Go 模块,并在当前目录中生成一个 go.mod 文件。该文件是一个纯文本文件,其中包含用于管理模块依赖关系的信息,例如模块名称、版本和所需的依赖项等。

 go mod tidy

使用 go mod tidy 命令来自动清理不需要的依赖项;使用 go mod download 命令来下载一组特定的依赖项;使用 go mod vendor 命令将依赖项复制到当前目录的 vendor 目录中等等。通过使用这些命令,开发者可以更轻松地管理 Go 模块和依赖项。
在这里插入图片描述
解决golang提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed

 go env -w GOPROXY=https://goproxy.cn

在这里插入图片描述

使用自己创建的第三方包

创建greeting文件

go mod init greeting

package greetings

import "fmt"

func Hello(name string) string {
	message := fmt.Sprintf("Hi,%v Welcome!", name)
	// := 是声明初始化变量简写
	return message
}


由于没有发布模块,将包替换为本地路径

go mod edit -replace example.com/greetings=./greetings

在这里插入图片描述

在这里插入图片描述

web-service-gin

Gin 简化了许多与构建 Web 应用程序相关的编码任务,包括 Web 服务

目标,创建接口
/albums

  • GET – Get a list of all albums, returned as JSON.
  • POST – Add a new album from request data sent as JSON.

/albums/:id

  • GET – Get an album by its ID, returning the album data as JSON.

get

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// album represents data about a record album.
type album struct {
	ID     string  `json:"id"`
	Title  string  `json:"title"`
	Artist string  `json:"artist"`
	Price  float64 `json:"price"`
}

// albums slice to seed record album data.
var albums = []album{
	{ID: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99},
	{ID: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99},
	{ID: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99},
}

// getAlbums responds with the list of all albums as JSON.
func getAlbums(c *gin.Context) {
	c.IndentedJSON(http.StatusOK, albums)
}
func main() {
	router := gin.Default()
	router.GET("/albums", getAlbums)

	router.Run("localhost:8080")
}

cmd运行

curl http://localhost:8080/albums    --header "Content-Type: application/json"     --request "GET"

在这里插入图片描述

post

curl http://localhost:8080/albums     --include     --header "Content-Type: application/json"     --request "POST"     --data '{"id": "4", "title": "The Modern Sound of Betty Carter", "artist": "Betty Carter", "price": 49.99}'

get id

curl http://localhost:8080/albums/4 #4是id

完整代码:

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// album represents data about a record album.
type album struct {
	ID     string  `json:"id"`
	Title  string  `json:"title"`
	Artist string  `json:"artist"`
	Price  float64 `json:"price"`
}

// albums slice to seed record album data.
var albums = []album{
	{ID: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99},
	{ID: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99},
	{ID: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99},
}

// getAlbums responds with the list of all albums as JSON.
func getAlbums(c *gin.Context) {
	// Context.IndentedJSON to serialize the struct into JSON and add it to the response
	c.IndentedJSON(http.StatusOK, albums)
}

// postAlbums adds an album from JSON received in the request body.
func postAlbums(c *gin.Context) {
	var newAlbum album

	// Call BindJSON to bind the received JSON to
	// newAlbum.
	if err := c.BindJSON(&newAlbum); err != nil {
		return
	}

	// Add the new album to the slice.
	albums = append(albums, newAlbum)
	c.IndentedJSON(http.StatusCreated, newAlbum)
}

// getAlbumByID locates the album whose ID value matches the id
// parameter sent by the client, then returns that album as a response.
func getAlbumByID(c *gin.Context) {
	id := c.Param("id")

	// Loop over the list of albums, looking for
	// an album whose ID value matches the parameter.
	for _, a := range albums {
		if a.ID == id {
			c.IndentedJSON(http.StatusOK, a)
			return
		}
	}
	c.IndentedJSON(http.StatusNotFound, gin.H{"message": "album not found"})
}

func main() {
	router := gin.Default()
	//Initialize a Gin router
	router.GET("/albums", getAlbums)
	//associate the GET HTTP method and /albums path with a handler function.
	router.POST("/albums", postAlbums)
	router.GET("/albums/:id", getAlbumByID)
	router.Run("localhost:8080")
	//attach the router to an http.Server and start the server.
}

如何写go

介绍

go tool, fetch, build, 安装 Go modules, packages, commands 标准方法

代码架构

it’s a good habit to organize your code as if you will publish it someday

程序

编译和运行一个程序
1.choose a module path (we’ll use example.com/user/hello) and create a go.mod file that declares it

源代码第一句package name,

build ,install 程序

go install xxx

该命令产生可一个可执行二进制文件在$HOME/go/bin/hello ( Windows, %USERPROFILE%\go\bin\xxx.exe).

安装目录由 GOPATH ,GOBIN/bin环境变量控制。
可以用go env 命令设置值

go env -w GOBIN=/somewhere/else/bin
go env -u GOBIN

在这里插入图片描述
下载的包在 Go安装目录\bin\pkg\mod

Go旅程

1.基础语法 数据结构
ps:
:= 是 Go 语言里的一个声明语句,用于定义并初始化一个新的变量。它会根据变量值的类型来自动推断该变量的类型,在函数外不可定义

类型放在后面定义

字符串用双引号

2.方法 接口

方法只是一个接受receiver参数的函数

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)

}

func main() {
	
	v := Vertex{3, 4}
	fmt.Println(v.Abs())

}

3.concurrency primitives并发特性

https://tour.go-zh.org/welcome/1

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

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

相关文章

OpenCV EigenFaceRecognizer 人脸识别

目录 一、人脸检测vs人脸识别 二、数据库 三、准备需要识别的人脸 四、人脸识别(OpenCV) 一、人脸检测vs人脸识别 人脸检测只是需要检测图像中是否有人脸,而人脸识别是一个程序能够识别出给定图像或者视频中的人脸。 二、数据库 人脸数据库,这个博客…

大数据之Hadoop分布式数据仓库HBase

目录: 一、Hadoop的局限二、HBase简介三、HBase Table四、数据的读写流程简述五、HBase Java API 1.0 的基本使用六、HBase Java API 2.0 的基本使用七、正确连接Hbase八、Hbase 常用 Shell 命令九、Hbase容灾与备份十、引入Phoenix core JAR包(HBase中间…

好用免费的电脑摄像头录视频软件分享!

案例:如何录制电脑的摄像头? 【这周我需要开一个视频会议,会议十分重要,我希望把它录制下来。有没有小伙伴知道,电脑摄像头如何录制?求一个可以快速上手的方法!】 在现如今的数字化时代&#…

计算机网络学习03(OSI、TCP/IP网络分层模型详解))

1、OSI 七层模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能&#xff0…

【小程序】图文教程:完整说明如何把小程序代码提交到gitee上

目录 建项目本地打开配置远程分支发布到远程分支检验后续提交 建项目 注*:会在gitee上建项目的可以略过 进入到gitee官网,点击右侧的,创建新项目 进入到该页面: 填好之后,点击创建 进入下面页面,点击初…

用GPT 从0搭建 Jest 到帮写测试用例

本文作者为 360 数据平台部前端开发工程师 为什么要用AI写单测 这个问题分两点来说,第一是为什么要写单测,第二是为什么要用AI。 先来说为什么写单测,这很简单,我们项目或者说我们前端团队有公共模块,包含有组件类型、…

ipv6地址技术详解

一、什么是IPv6? IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编…

你可能需要的IDEA-Java开发插件

Idea开发插件 Alibaba Cloud AI Coding Assistant 阿里云智能编码插件(Alibaba Cloud AI Coding Assistant)是一款AI编程助手,它提供代码智能补全和代码示例搜索能力,帮助你更快更高效地写出高质量代码。 让我觉得比较有意思的…

Docker安装在Linux系统上(纯步骤)

Docker安装在Linux系统上操作步骤 本文章只有操作步骤,没有原理解释,只是用来提醒自己安装步骤 下面是docker官网,也有安装详情 https://docs.docker.com/engine/install/centos/ 安装分为四步走 我使用的是CentOS7版本,下面命令…

Linux基本权限

文章目录 前言一、Shell命令以及运行原理1.Shell的定义2.为什么用户不能直接使用kernel? 二、Linux中的权限1.权限是什么?2.如何操作权限呢?(怎么修改权限)1. 修改文件属性2. 修改文件角色 3.为什么要有权限 三、粘滞位…

直接插入排序(Straight Insertion Sort)

本文已收录于专栏 《算法合集》 一、简单释义 1、算法概念 对插入第i个记录时,R1、R2、…、Ri-1均已排好顺序。因此,将第i个记录Ri-1、…、R2、R1进行比较,找到合适的位置插入,他简单明了但是速度很慢。 2、算法目的 把无序数组通…

windows下免费本地部署类ChatGpt的国产ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 Chat…

禁止右键禁止复制禁止选择网页内容的CSS和JS代码(支持PC和移动端)

禁止右键禁止复制禁止选择网页内容的CSS和JS代码(支持PC和移动端),收藏吧,用得上。 body {-moz-user-select: none;/* Firefox私有属性 */-webkit-user-select: none;/* WebKit内核私有属性 */-ms-user-select: none;/* IE私有属…

项目1登录功能优化(中间件添加操作信息,统一日志输出)

中间件添加操作信息 context增加属性userid用于储存访问者id,便于后期使用中间件添加操作信息 type Context struct { //......,context其他属性 Userid int} 对于添加操作信息的中间件函数 // 添加用户操作中间件func Addoperationmid(db *sql.DB) gee7.HandlerFunc { retu…

SpringBoot【运维实用篇】---- 多环境开发

SpringBoot【运维实用篇】---- 多环境开发 1. 多环境开发(yaml单一文件版)2. 多环境开发(yaml多文件版)3. 多环境开发(properties多文件版)4. 多环境开发独立配置文件书写技巧5. 多环境开发控制 讲的内容距…

【LeetCode】1000题挑战(220/1000)

1000题挑战 没有废话,直接开刷! 目录 1000题挑战 没有废话,直接开刷! 第一题:119. 杨辉三角 II - 力扣(Leetcode) 题目接口 解题思路 代码: 过过过过啦!&#x…

【Python】【进阶篇】13、Django安装与配置教程

目录 Django安装与配置教程1. Windows系统安装Django1) 离线安装2) 在线安装3) 配置Django环境变量4) 检查是否安装成功 2. Linux和Mac系统安装Django1) 使用终端在线安装2) 下载安装包离线安装 Django安装与配置教程 本节主要对 Django 在各个平台上的安装方式与配置进行讲解…

Blender 插件UvSquares

目录 1. UvSquares插件1.1 解压UvSquares插件1.2 blender偏好设置1.3 打开插件1.4 安装插件1.5 勾选插件UvSquares1.6 安装UvSquares插件前1.7 安装UvSquares插件后 1. UvSquares插件 Blender 的 UV 编辑器工具,可将 UV 选择重塑为网格。 下载:https:/…

关于jsonp的理解。利用 百度“联想搜索”接口

什么是 回调函数? 在 JavaScript 中,回调函数是指将一个函数作为参数传递给另一个函数,以在某些操作完成后通知调用者。当操作完成时,被调用的函数(即回调函数)将被调用,以执行某些指定的操作或…

Ajax的简单使用

目录 1、ajax概述 2、模拟ajax 3、Jquery实现ajax (1)通用开发步骤 (2)示例 注册用户名重复性验证 (3)示例 ajax解析json数据 (4)实现细节 4、axios实现ajax 5、ajax发送PUT…