Go语言基本语法

news2025/2/27 8:12:36

Go语言基本语法

设置 GOPATH 环境变量

开始写 go 项目代码之前,需要我们先配置好环境变量。编辑 ~/.bash_profile(在终端中运行 vi ~/.bash_profile 即可)来添加下面这行代码(如果你找不到 .bash_profile,那自己创建一个就可以了)

export GOPATH=$HOME/go

保存然后退出你的编辑器。然后在终端中运行下面命令

source ~/.bash_profile

提示:$HOME 是每个电脑下的用户主目录,每个电脑可能不同,可以在终端运行 echo $HOME 获取

GOROOT 也就是 Go 开发包的安装目录默认是在 /usr/local/go,如果没有,可以在 bash_profile 文件中设置。

export GOROOT=/usr/local/go

然后保存并退出编辑器,运行 source ~/.bash_profile 命令即可。

短变量声明并初始化

var 的变量声明还有一种更为精简的写法,例如:

hp := 100

这是Go语言的推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。

注意:由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。

如果 hp 已经被声明过,但依然使用:=时编译器会报错,代码如下:

// 声明 hp 变量var hp int// 再次声明并赋值hp := 10

编译报错如下:

no new variables on left side of :=

意思是,在“:=”的左边没有新变量出现,意思就是“:=”的左边变量已经被声明了。

短变量声明的形式在开发中的例子较多,比如:

conn, err := net.Dial("tcp","127.0.0.1:8080")

net.Dial 提供按指定协议和地址发起网络连接,这个函数有两个返回值,一个是连接对象(conn),一个是错误对象(err)。如果是标准格式将会变成:

var conn net.Connvar err errorconn, err = net.Dial("tcp", "127.0.0.1:8080")

因此,短变量声明并初始化的格式在开发中使用比较普遍。

注意:在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即便其他变量名可能是重复声明的,编译器也不会报错,代码如下:

conn, err := net.Dial("tcp", "127.0.0.1:8080")conn2, err := net.Dial("tcp", "127.0.0.1:8080")

上面的代码片段,编译器不会报 err 重复定义。

匿名变量

匿名变量的特点是一个下画线“”,“”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。例如:

func GetData() (int, int) {
    return 100, 200
}
func main(){
    a, _ := GetData()
    _, b := GetData()
    fmt.Println(a, b)
}

代码运行结果:

100 200

GetData() 是一个函数,拥有两个整型返回值。每次调用将会返回 100 和 200 两个数值。

代码说明如下:

  • 第 5 行只需要获取第一个返回值,所以将第二个返回值的变量设为下画线(匿名变量)。
  • 第 6 行将第一个返回值的变量设为匿名变量。
使用指针修改值

通过指针不仅可以取值,也可以修改值。

前面已经演示了使用多重赋值的方法进行数值交换,使用指针同样可以进行数值交换,代码如下:

package main

import "fmt"

// 交换函数
func swap(a, b *int) {
    // 取a指针的值, 赋给临时变量t
    t := *a
    // 取b指针的值, 赋给a指针指向的变量
    *a = *b
    // 将a指针的值赋给b指针指向的变量
    *b = t
}

func main() {
 // 准备两个变量, 赋值1和2
   x, y := 1, 2
   // 交换变量值
   swap(&x, &y)
   // 输出变量值
   fmt.Println(x, y)
}

运行结果:

2 1

代码说明如下:

  • 第 6 行,定义一个交换函数,参数为 a、b,类型都为 *int 指针类型。
  • 第 9 行,取指针 a 的值,并把值赋给变量 t,t 此时是 int 类型。
  • 第 12 行,取 b 的指针值,赋给指针 a 指向的变量。注意,此时*a的意思不是取 a 指针的值,而是“a 指向的变量”。
  • 第 15 行,将 t 的值赋给指针 b 指向的变量。
  • 第 21 行,准备 x、y 两个变量,分别赋值为 1 和 2,类型为 int。
  • 第 24 行,取出 x 和 y 的地址作为参数传给 swap() 函数进行调用。
  • 第 27 行,交换完毕时,输出 x 和 y 的值。

golang router传递多个参数

router.GET("/hello/:first_name/:last_name", Hello)

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "hello, %s %s!
", ps.ByName("first_name"), ps.ByName("last_name"))
}

golang 当import依赖同名的时候处理方式(hp 类似别名)

hp "github.com/kirinlabs/HttpRequest"

golang interface类型转string等其他类型

inter 是interface类型,转化为string类型是:

    str := inter .(string)

golang router传参问题

golang 发送http请求时设置header

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"                                                                                                                                                     
    "os"
    "encoding/json"
)

func main() { //生成client 参数为默认
    client := &http.Client{}
    //生成要访问的url
    url := "http://somesite/somepath/"
    //提交请求
    reqest, err := http.NewRequest("GET", url, nil)

    //增加header选项
    reqest.Header.Add("Cookie", "xxxxxx")
    reqest.Header.Add("User-Agent", "xxx")
    reqest.Header.Add("X-Requested-With", "xxxx")

    if err != nil {
        panic(err)
    }   
    //处理返回结果
    response, _ := client.Do(reqest)
    defer response.Body.Close()

golang 转换slice/array 变成xxx,yyy,zzz 【带逗号的字符串】

package main
 
import (
	"fmt"
	"strings"
)
 
func main() {
	age := []int{1, 3, 5}
	name := []string{"dongTech"}
 
	fmt.Println(convert(age))
	fmt.Println(convert(name))
}
 
//[a] -> a -> a
//[a b c] -> a b c -> a,b,c
func convert(array interface{}) string {
	return strings.Replace(strings.Trim(fmt.Sprint(array), "[]"), " ", ",", -1)
}

golang gjson解析json

package main
 
import "github.com/tidwall/gjson"
 
const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`
 
func main() {
    value := gjson.Get(json, "name.last")
    println(value.String())
}

golang基础:在Go中打印带有双引号的字符串

package main

import "fmt"

func main() {
  var lang = "Golang"
  fmt.Printf("%q", lang)
}

结果:"Golang"

golang 获取get/post请求中的请求头和表单数据

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "这是请求中的路径:", r.URL.Path)
    fmt.Fprintln(w, "这是请求中的路径?后面的参数:", r.URL.RawQuery)
    fmt.Fprintln(w, "这是请求中的User-Agent信息:", r.Header["User-Agent"])
    fmt.Fprintln(w, "这是请求中的User-Agent信息:", r.Header.Get("User-Agent"))

    // 获取请求体内容的长度
    // len := r.ContentLength
    // body := make([]byte, len)
    // r.Body.Read(body)
    // fmt.Fprintln(w, "请求体中的内容是:", string(body))

    // 解析表单,在调用r.Form r.PostForm之前执行
    r.ParseForm()
    // fmt.Fprintln(w, "表单信息:", r.Form)
    fmt.Fprintln(w, "表单信息:", r.PostForm)

    // fmt.Fprintln(w, "用户名:", r.FormValue("username"))
    // fmt.Fprintln(w, "密码:", r.FormValue("password"))
    fmt.Fprintln(w, "密码:", r.PostFormValue("password"))

}

func main() {
    http.HandleFunc("/hello", handler)
    http.ListenAndServe(":8080", nil)

}

golang 参数及返回值

参数一指定数据类型为int
参数二 (…interface{}) 可传任何多个类型的参数
返回值:单个返回值直接指定数据类型可以不使用 (),多个返回值需使用()。各返回值之间使用逗号分隔

func main() {
    demo.Params(10, 20, "golang", true)
}

func Params(id int, params ...interface{}) (error, error) {
    fmt.Println(id)
    fmt.Println(params[0])
    fmt.Println(params[1])
    fmt.Println(params[2])
    for key, val := range params {
        fmt.Println("key", key)
        fmt.Println("val", val, reflect.TypeOf(val))
    }
    return nil, errors.New("error")
}

golang中的字符串拼接

s1 := "字符串"
s2 := "拼接"
s3 := s1 + s2
fmt.Print(s3) //s3 = "打印字符串"

golang - 数字转字符串

package main

import (
    "strconv"
)

func toString(a interface{}) string {
    if v, p := a.(int); p {
        return strconv.Itoa(v)
    }
    if v, p := a.(int16); p {
        return strconv.Itoa(int(v))
    }
    if v, p := a.(int32); p {
        return strconv.Itoa(int(v))
    }
    if v, p := a.(uint); p {
        return strconv.Itoa(int(v))
    }
    if v, p := a.(float32); p {
        return strconv.FormatFloat(float64(v), 'f', -1, 32)
    }
    if v, p := a.(float64); p {
        return strconv.FormatFloat(v, 'f', -1, 32)
    }
    return "change to String error"
}

golang func方法名调用不到问题

func函数名首字母小写  private。
func函数名首字母大写  public

golang 关闭http请求

if resp != nil {
		resp.Close()
}

Beego ———— 从浏览器中获取string数据

路由:
beego.Router("/getstring",&controllers.Demo3Controller{},"Get:Getstring")
例子:
package controllers
 
import (
	"github.com/astaxie/beego"
	"fmt"
	"strings"
)
 
type Demo3Controller struct {
	beego.Controller
}
 
func (this *Demo3Controller)Getstring(){
 
	username := this.GetString("username")
	nickname := this.GetString("nickname")
	password := this.GetString("password")
	this.Ctx.WriteString(username+nickname+password)
}

golang将go打包成exe

go build -o mygo hello.go

golang获取参数

golang获取链接中的参数

name := c.GetString("name")

golang获取请求头的参数

request
password := c.Ctx.Input.Header("password")

golang获取body体中的参数

var data map[string]interface{}
json.Unmarshal(c.Ctx.Input.RequestBody, &data)
name     := data["name"].(string)
password := data["password"].(string)

golang类型转换

Golang interface{}转换成string

var data map[string]interface{}
json.Unmarshal(c.Ctx.Input.RequestBody, &data)
name     := data["name"].(string)
password := data["password"].(string)

golang interface类型转string等类型

inter 是interface类型,转化为string类型是:
str := inter .(string)

转为其他类型也类似

golang 获取Auth参数值

https://www.cnblogs.com/zdz8207/p/golang-learn-10.html

 authString := base.Ctx.Input.Header("Authorization")
 beego.Debug("AuthString:", authString)
 
 kv := strings.Split(authString, " ")
 if len(kv) != 2 || kv[0] != "Bearer" {
     beego.Error("AuthString invalid:", authString)
     return nil, errInputData
 }
 tokenString := kv[1]

Golang里实现Http服务器并解析header参数和表单参数

package main

import (
	"fmt"
	"net/http"
	"strconv"
)

func main() {
	HttpStart(8088)
}

func HttpStart(port int) {
	http.HandleFunc("/hello", helloFunc)
	err := http.ListenAndServe(":"+strconv.Itoa(port), nil)
	if err != nil {
		fmt.Println("监听失败:", err.Error())
	}
}

func helloFunc(w http.ResponseWriter, r *http.Request) {
	fmt.Println("打印Header参数列表:")
	if len(r.Header) > 0 {
		for k, v := range r.Header {
			fmt.Printf("%s=%s\n", k, v[0])
		}
	}
	fmt.Println("打印Form参数列表:")
	r.ParseForm()
	if len(r.Form) > 0 {
		for k, v := range r.Form {
			fmt.Printf("%s=%s\n", k, v[0])
		}
	}
	//验证用户名密码,如果成功则header里返回session,失败则返回StatusUnauthorized状态码
	w.WriteHeader(http.StatusOK)
	if (r.Form.Get("user") == "admin") && (r.Form.Get("pass") == "888") {
		w.Write([]byte("hello,验证成功!"))
	} else {
		w.Write([]byte("hello,验证失败了!"))
	}
}

输出参数:

运行后,在chrom浏览器里执行请求:http://127.0.0.1:8001/hello?user=admin&pass=888,服务端会打印参数列表如下:

打印Header参数列表:
Accept-Language=zh-CN,zh;q=0.9
Connection=keep-alive
Cache-Control=max-age=0
Upgrade-Insecure-Requests=1
User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.19 Safari/537.36
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding=gzip, deflate, br
打印Form参数列表:
user=admin
pass=888

并且会返回成功结果给客户端的,浏览器里运行结果为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果浏览器里不是请求/hello则会报404,如果参数写其他的也会返回验证失败的结果!

golang test测试

package utils

import "testing"

func TestDoubleToSingleQuotation(t *testing.T) {
	payload := `{
		"ret": "200",
		"msg": "success",
		"data": [
		    {
			  "type": "UI",
			  "name": "operationalSecurity",
			  "metadata": {
				"resourceType": 1,
				"displayName": "运营防盗",
				"sort": "100",
				"content": "operationalSecurity",
				"contentMd5": "33016394cd1cddeaa33de24fa68035d1"
			  },
			  "client": "web_app",
			  "createdBy": "5e1c271c0c21f80040e5b3b0",
			  "createdAt": "2020-03-20T08:32:43.266Z",
			  "updatedAt": "2020-03-20T08:32:43.266Z",
			  "id": "5e747fabf5d6190039477e55"
		    },
		    {
			  "parent": "5e747fabf5d6190039477e55",
			  "type": "UI",
			  "name": "efencenew",
			  "metadata": {
				"resourceType": 1,
				"displayName": "电子围栏",
				"sort": "101",
				"content": "operationalSecurity:efence",
				"contentMd5": "025ac1a7531a4260e4df979a7f0065b1"
			  },
			  "client": "web_app",
			  "createdBy": "5e1c271c0c21f80040e5b3b0",
			  "createdAt": "2020-03-20T08:46:06.120Z",
			  "updatedAt": "2020-03-20T08:46:06.120Z",
			  "id": "5e7482cef5d6190039477e56"
		    } 
		]
	  }`

	res := DoubleToSingleQuotation(payload, "data.#.metadata.content")
	t.Logf("res: %s", res)
}

测试命令:

KEdeMac-mini:utils datahunter$ go test -v .

结果:

=== RUN   TestDoubleToSingleQuotation
    TestDoubleToSingleQuotation: iroot_context_test.go:47: res: 'operationalSecurity','operationalSecurity:efence'
--- PASS: TestDoubleToSingleQuotation (0.00s)
PASS
ok      common.dh.cn/utils      0.021s

golang 如何判断err

func WriteConfig(w io.Writer, conf *Config) error {
	buf, err := json.Marshal(conf)
	if err != nil {
		return fmt.Errorf("could not marshal config: %v", err)
	}
	if err := WriteAll(w, buf); err != nil {
		return fmt.Errorf("could not write config: %v", err)
	}
	return nil
}

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

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

相关文章

每日五道java面试题之spring篇(七)

目录: 第一题. 什么是Spring beans?第二题. 一个 Spring Bean 定义 包含什么?第三题. 如何给Spring 容器提供配置元数据?Spring有几种配置方式?第四题. Spring基于xml注入bean的几种方式?第五题:你怎样定义类的作用域…

41.仿简道云公式函数实战-数学函数-SUMIF

1. SUMIF函数 SUMIF 函数可用于计算子表单中满足某一条件的数字相加并返回和。 2. 函数用法 SUMIF(range, criteria, [sum_range]) 其中各参数的含义及使用方法如下: range:必需;根据 criteria 的条件规则进行检测的判断字段。支持的字段…

prime_series_level-1靶场详解

环境搭建 官网https://www.vulnhub.com/entry/prime-1,358/ 直接导入靶机 解题思路 arp-scan -l 确认靶机ip为192.168.236.136 也可以使用nmap扫网段 nmap -sn 192.168.236.0/24 使用nmap扫描靶机开放的端口 nmap -sS -T5 --min-rate 10000 192.168.236.136 -sC -p- &#xf…

ABBYY FineReader16文档转换、PDF管理与文档比较功能介绍

ABBYY FineReader 16作为一款OCR和PDF一体化程序,其强大的功能使得文档处理变得简单高效。在众多功能中,文档转换、PDF管理和文档比较这三大功能尤为突出,成为了众多企业和个人用户的首选工具。 ABBYY Finereader 16-安装包下载如下&#xff…

好书推荐丨AI绘画全面精通:软件平台+脚本文案+设计制作+案例实战

文章目录 写在前面AI绘画推荐图书图书简介本书特色作者简介 推荐理由粉丝福利写在后面 写在前面 本期博主给大家带来了一本全新出版的AI绘画类书籍,《AI绘画全面精通:软件平台脚本文案设计制作案例实战》,对人工智能感兴趣的小伙伴快来看看吧…

什么时候要用到Reflect API?

参考文档 https://www.zhihu.com/question/460133198 https://cn.vuejs.org/guide/extras/reactivity-in-depth.html https://juejin.cn/post/7103764386220769311 Reflect API 一般搭配 Proxy API 一起使用。什么是 Proxy API 呢? 先回顾下 vue 的数据响应性是如何…

27-树-左叶子之和

这是树的第27篇算法,力扣链接。 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 2…

前后端项目宝塔linux部署(springboot,vue,python)

宝塔linux安装就省略了,网上一堆 1.部署后端 1.首先把自己项目里面打包好的的jar包上传到服务器随便一个地方,我这里就上传到www/wwwroot下面了,宝塔的文件页面可以很便携上传 2.然后到下面这个页面 选那个java环境管理装个jdk&#xff…

在github的README.md中插入视频;在github的README.md中添加gif演示动画

最近需要再github中上传项目的源代码,应导师的要求,需要再README中加入对实验视频的展示,但是github的README.md其实就是一个markdown文件,据我的理解这个文件里应该无法直接插入视频吧?(如果后续有办法直接…

【postgresql】数据表id自增与python sqlachemy结合实例

需求: postgresql实现一个建表语句,表名:student,字段id,name,age, 要求:每次添加一个数据id会自动增加1 在PostgreSQL中,您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…

2024环境,资源与绿色能源国际会议(ICERGE2024)

2024环境,资源与绿色能源国际会议(ICERGE2024) 一、【会议简介】 2024环境、资源与绿色能源国际会议(ICERGE2024)将于2024年在三亚举行。该会议是一个围绕环境、资源与绿色能源研究领域的国际学术交流活动。 会议主题包括但不限于环境科学、环境工程、资源利用、绿…

C++之类和对象(2)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 2. 赋值运算符只能重载成类的成员函数不能重载成全局函数 3. 用户没有显式实现时&…

pycharm如何安装pygame库

pycharm如何安装pygame库 PyCharm是Python中广受欢迎的一种IDE,它可以为用户提供许多工具和便利的服务,从而大大提高开发效率。pygame库可以用python进行游戏开发提供很好的支持,那么在ptcharm中如何安装pygame库呢? 一、安装步…

Sora背后的技术原理解析(简单易懂版本)

本篇文章是OpenAI发布的最强AI视频生成工具Sora技术详解(非官方),然而,Sora的野心远不止是视频生成,而是作为一个世界模型。之前的文章中已经介绍了很多关于文生图的相关技术,相信有了文生图的基础后再来学…

[c/c++] static 关键字

从修饰的对象来看,static 可以修饰局部变量,也可以修饰全局变量,可以修饰函数;可以修饰类中的成员变量以及成员函数。 从生命周期的角度来看,static 修饰的对象的生命周期,与进程的生命周期是一致的。 从…

大话设计模式——3.建造者模式(Builder Pattern)

1.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UML图 2.示例: 汽车或者电脑的组装可以采用构造者模式进行设计,如汽车的引擎或者轮胎,电脑的处理器、内存、主板等都可以进行…

【Java设计模式】四、适配器模式

文章目录 1、适配器模式2、举例 1、适配器模式 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁目的是将一个类的接口转换成客户希望的另外一个接口适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 最后,适配器…

【51单片机】红外遥控红外遥控电机调速(江科大)

1.红外遥控简介 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工,异步 红外LED波长:940nm 通信协议标准:NEC标准 2.硬件电路 红外发送部分 IN高电平时,LED不亮,IN低电平时&…

Langchain-Chatchat:离线运行的大模型知识库 | 开源日报 No.182

chatchat-space/Langchain-Chatchat Stars: 22k License: Apache-2.0 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现的开源、可离线部署的检索增强生成 (RAG) 大模型知识库项目。该项目是一个可以实现完全本地化推理的知识库增强方案,重点解决数据安全保护…

【C语言】linux内核netdev_start_xmit函数

一、中文注释 static inline netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq, bool more) {// 获取网络设备操作集合const struct net_device_ops *ops dev->netdev_ops;int rc;// 调用实际发送数据包的函数&…