GoLang语言

news2024/11/24 9:29:02

基础

安装Go扩展

go build

在项目目录下执行go build

go run

像执行脚本文件一样执行Go代码

go install

go install分为两步:

1、 先编译得到一个可执行文件

2、将可执行文件拷贝到GOPATH/bin

Go 命令

go build :编译Go程序

go build -o "xx.exe" :编译成xx.exe文件

go run main.go: 像执行脚本一样执行main.go文件

go install: 先编译后拷贝

变量

3种声明方式:

  1. var name1 string

  2. var name2 = "沙河娜扎"

  3. 函数内部专属:name3:="沙河小王子"

常量

const PI = 3.1415926

const UserNotExistErr = 10000

iota:实现枚举

两个要点:

  1. iota在const关键字出现时将被重置为0

  2. const中每新增一行常量声明,iota累加1

基本数据类型

整型

无符号整型:uint8uint16uint32uint64

带符号整型:int8int16int32int64

uintint:具体是32位还是64位看操作系统

uintptr:表示指针

浮点型

float64float32

Go语言中浮点数默认是float64

复数

complex128complex64

布尔值

truefalse

不能和其他的类型做转换

字符串

常用方法

字符串不能修改

byte和rune类型

都属于类型别名

复合数据类型

        数组

数组的声明

// 数组是存放元素的容器
// 必须指定存放的元素的类型和容量(长度)
// 数组的长度是数组类型的一部分
var a1 [3]bool // [true false true]
var a2 [4]bool // [true true false false]

fmt.Printf("a1:%T a2:%T\n", a1, a2)

数组的初始化

// 数组的初始化
// 如果不初始化:默认元素都是零值(布尔值:false, 整型和浮点型都是0, 字符串:"")
fmt.Println(a1, a2)
// 1. 初始化方式1
a1 = [3]bool{true, true, true}
fmt.Println(a1)
// 2. 初始化方式2:根据初始值自动推断数组的长度是多少
// a10 := [9]int{0, 1, 2, 3, 4, 4, 5, 6, 7}
a10 := [...]int{0, 1, 2, 3, 4, 4, 5, 6, 7}
fmt.Println(a10)
// 3. 初始化方式3:根据索引来初始化
a3 := [5]int{0: 1, 4: 2}
fmt.Println(a3)

数组的遍历

// 数组的遍历
citys := [...]string{"北京", "上海", "深圳"} // 索引:0~2 citys[0],citys[1],citys[2]
// 1. 根据索引遍历
for i := 0; i < len(citys); i++ {
    fmt.Println(citys[i])
}
// 2. for range遍历
for i, v := range citys {
    fmt.Println(i, v)
}

二维数组

// 多维数组
// [[1 2] [3 4] [5 6]]
var a11 [3][2]int
a11 = [3][2]int{
    [2]int{1, 2},
    [2]int{3, 4},
    [2]int{5, 6},
}
fmt.Println(a11)

// 多维数组的遍历
for _, v1 := range a11 {
    fmt.Println(v1)
    for _, v2 := range v1 {
        fmt.Println(v2)
    }
}

数组是值类型

// 数组是值类型
b1 := [3]int{1, 2, 3} // [1 2 3]
b2 := b1              // [1 2 3] Ctrl+C Ctrl+V => 把world文档从文件夹A拷贝到文件夹B
b2[0] = 100           // b2:[100 2 3]
fmt.Println(b1, b2)   // b1:[1 2 

切片(slice)

切片指向了一个底层的数组。

切片的长度就是它元素的个数。

切片的容量是底层数组从切片的第一个元素到最后一个元素的数量。

切片的定义

// 切片的定义
var s1 []int    // 定义一个存放int类型元素的切片
var s2 []string // 定义一个存放string类型元素的切片
fmt.Println(s1, s2)
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // true

切片的初始化

// 初始化
s1 = []int{1, 2, 3}
s2 = []string{"沙河", "张江", "平山村"}
fmt.Println(s1, s2)
fmt.Println(s1 == nil) // false
fmt.Println(s2 == nil) // false

切片的长度和容量

// 长度和容量
fmt.Printf("len(s1):%d cap(s1):%d\n", len(s1), cap(s1))
fmt.Printf("len(s2):%d cap(s2):%d\n", len(s2), cap(s2)

make

make()函数用于创建指定长度和容量的切片。

s1 := make([]int, 5, 10)
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

s2 := make([]int, 0, 10)
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s2, len(s2), cap(s2))

切片的本质

切片就是一个框,框住了一块连续的内存。

切片属于引用类型,真正的数据都是保存在底层数组里的。

判断一个切片是否是空的,要是用len(s) == 0来判断

append

// 调用append函数必须用原来的切片变量接收返回值
// append追加元素,原来的底层数组放不下的时候,Go底层就会把底层数组换一个
// 必须用变量接收append的返回值
s1 = append(s1, "广州")
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
s1 = append(s1, "杭州", "成都")
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
ss := []string{"武汉", "西安", "苏州"}
s1 = append(s1, ss...) // ...表示拆开
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

copy

a1 := []int{1, 3, 5}
a2 := a1 // 赋值
var a3 = make([]int, 3, 3)
copy(a3, a1) // copy
fmt.Println(a1, a2, a3)
a1[0] = 100
fmt.Println(a1, a2, a3)

指针

Go语言中不存在指针操作,只需要记住两个符号:

  1. &:取地址

  2. *:根据地址取值

make和new的区别

  1. make和new都是用来申请内存的

  2. new很少用,一般用来给基本数据类型申请内存,stringint,返回的是对应类型的指针(*string、*int)。

  3. make是用来给slicemapchan申请内存的,make函数返回的的是对应的这三个类型本身

map

map也是引用类型,必须初始化之后才能使用。

func main() {
    var m1 map[string]int
    fmt.Println(m1 == nil)        // 还没有初始化(没有在内存中开辟空间)
    m1 = make(map[string]int, 10) // 要估算好该map容量,避免在程序运行期间再动态扩容
    m1["理想"] = 18
    m1["jiwuming"] = 35

    fmt.Println(m1)
    fmt.Println(m1["理想"])
    // 约定成俗用ok接收返回的布尔值
    fmt.Println(m1["娜扎"]) // 如果不存在这个key拿到对应值类型的零值
    value, ok := m1["娜扎"]
    if !ok {
        fmt.Println("查无此key")
    } else {
        fmt.Println(value)
    }

    // map的遍历
    for k, v := range m1 {
        fmt.Println(k, v)
    }
    // 只遍历key
    for k := range m1 {
        fmt.Println(k)
    }
    // 只遍历value
    for _, v := range m1 {
        fmt.Println(v)
    }
    // 删除
    delete(m1, "jiwuming")
    fmt.Println(m1)
    delete(m1, "沙河") // 删除不存在的key
}

函数

// 函数

// 函数存在的意义?
// 函数是一段代码的封装
// 把一段逻辑抽象出来封装到一个函数中,给它起个名字,每次用到它的时候直接用函数名调用就可以了
// 使用函数能够让代码结构更清晰、更简洁。

// 函数的定义
func sum(x int, y int) (ret int) {
    return x + y
}

// 没有返回值
func f1(x int, y int) {
    fmt.Println(x + y)
}

// 没有参数没有返回值
func f2() {
    fmt.Println("f2")
}

// 没有参数但有返回值的
func f3() int {
    ret := 3
    return ret
}

// 返回值可以命名也可以不命名

// 命名的返回值就相当于在函数中声明一个变量
func f4(x int, y int) (ret int) {
    ret = x + y
    return // 使用命名返回值可以return后省略
}

// 多个返回值
func f5() (int, string) {
    return 1, "沙河"
}

// 参数的类型简写:
// 当参数中连续多个参数的类型一致时,我们可以将非最后一个参数的类型省略
func f6(x, y, z int, m, n string, i, j bool) int {
    return x + y
}

// 可变长参数
// 可变长参数必须放在函数参数的最后
func f7(x string, y ...int) {
    fmt.Println(x)
    fmt.Println(y) // y的类型是切片 []int
}

// Go语言中函数没有默认参数这个概念

func main() {
    r := sum(1, 2)
    fmt.Println(r)

    _, n := f5()
    fmt.Println(n)

    f7("下雨了")
    f7("下雨了", 1, 2, 3, 4, 5, 6, 7)
}

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

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

相关文章

渗透测试入门教程(非常详细),从零基础入门到精通,看完这一篇就够了

什么是渗透测试 渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估&#xff0c;与黑客攻击不一样的是&#xff0c;渗透测试的目的是尽可能多地发现安全漏洞&#xff0c;而真实黑客攻击只要发现一处入侵点即可以进入目标系统。 一名优秀的渗透测试工程师…

vue 代理

一、常用的发送一个ajax请求&#xff1a; 1、xhr new XMLHttpRequest(),真正开发中不常用 2、jq&#xff0c;jq主要功能是获取dom&#xff0c;周边才是请求接口 3、axios&#xff08;大名鼎鼎的&#xff09; axios.get("url").then(response>{},error>{} )4、…

一篇文章教会你【elementUI搭建使用】

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组 件库. 安装 ElementUI npm i element-ui -S 在 main.js 中写入以下内容&#xff1a; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; Vue.use(Eleme…

Nginx网站服务详解(设置并发数、实现不同虚拟主机等)

一、nginx的最大并发数设置已经状态收集模块 [root192 nginx]# cat nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/user ngin…

【pytorch11】高阶操作

高阶操作 WhereGather where 三个参数&#xff0c;第一个是condition&#xff0c;第二个参数是源头A&#xff0c;第三个参数是源头B&#xff0c;也就是说有两项数据A和B&#xff0c;C有可能来自于A也有可能来自于B&#xff0c;如果全部来自于A的话直接赋值给A&#xff0c;如果…

AI写作助力:如何用AI降重工具快速提升论文原创性?

高查重率是许多毕业生的困扰。通常&#xff0c;高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法&#xff0c;如修改文本和增添原创内容&#xff0c;虽必要但耗时且成效不一。 鉴于此&#xff0c;应用AI工具进行AIGC降重成为了一个高效的解决方案。这些工具…

戴尔md3400存储控制器脱机故障 电池故障处理

看了一下网上关于DELL MD系列存储故障处理的文档还是比较少的&#xff0c;最近处理了一些关于MD系列存储的问题&#xff0c;稍微整理整理就分享一下&#xff0c;各位喜欢摸索的朋友可以稍稍做些参考&#xff0c;当然如果想寻求外援的也可以快速的找到合适的人。以便安全又快捷的…

事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)

一、引言 1、数据库管理系统DBMS为保证定义的事务是一个逻辑工作单元&#xff0c;达到引入事务的目的&#xff0c;实现的事务机制要保证事务具有原子性、一致性、隔离性和持久性&#xff0c;事务的这四个特性也统称为事务的ACID特性 2、当事务保持了ACID特性&#xff0c;才能…

98、验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 题解&#xff1a;若要验证是…

找不到xinput1_3.dll怎么办,实测有效的几种方法分享

在日的使用电脑过程中&#xff0c;我们经常会遇到各种各样的问题。其中之一就是找不到xinput1_3.dll文件。这个问题可能会影响到我们的游戏体验&#xff0c;甚至导致电脑无法正常运行。那么&#xff0c;又该如何解决这个问题呢&#xff1f;小编将全面解析找不到xinput1_3.dll对…

操作系统之《处理器机调度算法》【知识点+详细解题过程】

目录 PS:处理机调度算法相关公式&#xff1a; 1、【FCFS】先来先服务调度算法 2、【SJF&#xff08;SPF&#xff09;】短作业&#xff08;进程&#xff09;优先调度算法 3、【HRRF】最高响应比优先算法 4、【SRTF】最短剩余时间优先调度算法&#xff08;抢占式&am…

第二十课,认识列表与定义列表

一&#xff0c;列表的作用 思考一个问题&#xff1a;如果我想要在程序中&#xff0c;记录5名学生的信息&#xff0c;如姓名。 如何做呢&#xff1f; 这就是列表的作用&#xff0c;能帮助我们更加高效的存储各种数据 思考&#xff1a;如果一个班级100位学生&#xff0c;每个人…

树莓派4B_OpenCv学习笔记15:OpenCv定位物体实时坐标

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习 OpenCv定位物体实时位置&#xff0c;代码来源是…

2024年湖南建筑安全员考试题库,精准题库。

31.安全考核的对象应包括施工企业各管理层的&#xff08;&#xff09;、相关职能部门及岗位和工程项目参建人员。 A.技术负责人 B.安全负责人 C.主要负责人 D.第一负责人 答案&#xff1a;C 32.安全防护设施应标准化、定型化、&#xff08;&#xff09;。 A.规范化 B.工…

力扣 刷题 使用双指针进行数组去重分析

目录 双指针 一、26.删除有序数组中的重复项 题目 题解 二、80. 删除有序数组中的重复项 II 题目 题解 三、27. 移除元素 题目 题解 双指针 我们这里所说的双指针实际上并不是真正的指针&#xff0c;它只是两个变量&#xff0c;用于标识数组的索引等&#xff0c;因其…

深度探讨网络安全:挑战、防御策略与实战案例

目录 ​编辑 一、引言 二、网络安全的主要挑战 恶意软件与病毒 数据泄露 分布式拒绝服务攻击&#xff08;DDoS&#xff09; 内部威胁 三、防御策略与实战案例 恶意软件防护 网络钓鱼防护 数据泄露防护 总结 一、引言 随着信息技术的迅猛发展&#xff0c;网络安全问…

hive零基础入门

1、hive简介 hive&#xff1a;由facebook开源用于解决海量结构化数据的统计工具。 hive是基于Hadoop的数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供sql查询功能。 2、hive本质 hive的本质是HQL&#xff08;HiveSQL&#xff09;转化成MapR…

【IJCAI2024】LeMeViT: Efficient Vision Transformer with Learnable Meta Tokens

【IJCAI2024】LeMeViT: Efficient Vision Transformer with Learnable Meta Tokens for Remote Sensing Image Interpretation 论文&#xff1a;https://arxiv.org/abs/2405.09789 代码&#xff1a;https://github.com/ViTAE-Transformer/LeMeViT 由于相邻像素和图像块之间的高…

支持纳管达梦数据库,命令存储支持对接Elasticsearch 8,JumpServer堡垒机v3.10.11 LTS版本发布

2024年6月24日&#xff0c;JumpServer开源堡垒机正式发布v3.10.11 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在JumpServer v3.10.…

DDMA信号处理以及数据处理的流程---聚类

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…