前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Go——基础(2)

Go——基础(2)

作者头像
mumumu
发布于 2023-01-11 06:17:04
发布于 2023-01-11 06:17:04
28000
代码可运行
举报
文章被收录于专栏:blog1blog1
运行总次数:0
代码可运行

更多类型:struct、slice和映射

指针

  • 指针保存了值的内存的地址
  • *T是指向T的指针,零值为==nil==
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var p *int
  • ==&操作符==会生成一个指向其操作数的指针
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
i:=2
p=&i
  • ==*操作符==表示指针指向的底层值
  • 与C不同,Go没有指针运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    i,j:=12,31
    p:=&i//p是指向i的指针
    fmt.Println(*p)
    *p=21//通过指针改变i的值
    
    p=&j//p指向j,因为在前面p已经声明过了,所以不用:=
    *p=*p/2//通过指针对j进行除法运算
    
}

结构体

一个结构体就是一组字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import "fmt"

type jiegou struct{
    X int 
    Y int 
}

func main (){
    fmt.Println(jiegou{1,2})
}
//输出结果为{1,2}
结构体字段

结构体字段使用点号来访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Vertex struct {
    x int
    y int
}

func main (){
    v:=Vertex{1,2}
    v.x=3
    fmt.Println(v.x)
}//输出:3
结构体指针
  • 结构体字段可以用结构体指针来访问
  • 如果我们有一个指向结构体的指针p,通过(*p).x就可以访问字段x,直接写成==p.x==也可以
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Vertex struct {
    x int
    y int
}


func main (){
    v:=Vertex{1,2}
    p:=&v
    p.x=3
    fmt.Println(v)//结果为(3,2)
}
结构体文法

结构体文法通过==直接列出字段的值==来新分配一个结构体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Vertex struct {
    x int
    y int
}
func main (){
    v1=Vertex{1,2}
    v2=Vertex{x:1}//默认y:0
    v3=Vertex{}//默认x:0,y:0
    p=&Vertex{1,2}//p是指向{1,2}的结构体指针
}

数组

[n]T表示n个T类型的数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a[10]int 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var main (){
    var a[2]string
    a[0]="hello"
    a[1]="world"
    
    b:=[6]int{1,2,3,4,5,6}
}

切片

  • 每个数组的大小都是固定的,而切片为数组提供==动态大小的、灵活的视角==,在实践中,切片比数组更常用。
  • 类型[ ]T表示一个元素类型为T的切片
  • 切片通过两个下标来定,一个上界一个下界,二者用冒号分离 ==a[low : high]==
  • 它会选择一个半开区间,包括第一个元素,但排除最后一个元素
  • 例:包含下标从1到3的切片
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[1:4]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    b:=[6]int {1,2,3,4,5,6}
    
    var s[]int = b[1:4]//切片s包含b1-b3
}
切片就像数组的引用
  • 切片不存储数据,只是描述了底层数组的一段
  • 更改切片的元素会修改其底层数组对应的元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    names:=[4]string {
        "LiHua"
        "Mike"
        "Tom"
        "ha"
    }
    a:=names[0:2]
    a[0]="Jack"
    fmt.Pritln(names)//names[0]就改为了jack
    
}
切片文法
  • 切片文法类似于没有长度的数组文法
  • 数组文法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[3]bool{true,false,true}
  • 切片文法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[]bool{true,false,true}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    q:=[]int {1,2,3,4,5,5}
    p:=[]bool{true,false}
}
切片的默认行为
  • 在进行切片时,可以利用默认行为忽略上下界,切片的下界默认值为0,上界则是该切片的长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a[10]int 
a[0:10]
a[:10]
a[0:]
a[:]是等价的
切片的长度和容量
  • 切片的长度:包含的元素个数
  • 切片的容量:从第一个元素开始数,底层数组元素末尾的个数
  • 用len(s)获取长度,cap(s)获取容量
  • 可以通过重新切片扩展一个切片,给它提供足够容量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    s:=[]int {1,2,3,4,5,6}
    
    s=s[:0]//使其长度为0
    s=s[0:4]//重新切片扩展切片
    s=s[2:]//舍弃前两个值
}
nil切片
  • 切片的零值是nil
  • 含义:切片的长度和容量都为0,且没有底层数组
用make创建切片
  • 切片可以用内建函数make创建,这也是创建动态数组的方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a:=make([]int,2,2)//切片a的长度为2,容量为2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    a:=make([]int 5)
    printslice("a",a)b
    
    b:=make([]int,0,5)
    printslice("b",b)
    
    c:=b[0:2]
    printslice("c",c)
    
    d:=c[2:5]
}
切片的切片

切片可以包含任何类型,包括切片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main(){
    a:=[][]string{
		[]string{"_", "_", "_"},
		[]string{"_", "_", "_"},
		[]string{"_", "_", "_"},
}
}
向切片追加元素

使用内建函数append函数为切片追加新的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    var s[]int
    
    s=append(s,0)//添加一个空切片

    s=append(s,1)
    
    s=append(s,2,3,4)//可以一次性添加多个元素
}
Range

for循环的range形式可以遍历切片或映射

当用for循环遍历切片时,每次迭代都会返回两个值,第一个为当前元素下标,第二个为该下标所对应元素的一份副本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var pow[]{1,2,3,4,5,6}
func main (){
    for i;v=range pow{
        fmt.Println("%d,%d",i,v)
}
}

可以将下标或值赋予_来忽略它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i, _ := range pow//只返回下标
for _, value := range pow//只返回值

如果只需要索引,忽略第二个变量即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i := range pow

映射

  • 映射将键映射到值
  • 映射的零值为nil,nil映射没有键,也不会添加键
  • make函数会返回给定类型的映射,并将其初始化备用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Vertex struct{
	Lat,Long float64
}

var m map[string] Vertex

func main (){
    m=make(map[string]Vertex)
    m["Bell Labs"]=Vertex{
       	40.2,-32 
    }
    fmt.Println(m["Bell Labs"])
}
映射的文法
  • 映射的文法和结构体类似,但必须有键名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var m map[string]Vertex{
    "Bell Labs":Vertex{
        2,3
    }
    "Google":Vertex{
        2,4
}
}
  • 若顶级类型只是一个类型名,在文法元素中可以省略
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var m = map[string]Vertex{
	"Bell Labs": {40.68433, -74.39967},
	"Google":    {37.42202, -122.08408},
}
修改映射
  • 在m中插入或修改元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m[key]=elem
  • 获取元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
elem=m[key]
  • 删除元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete(m,key)
  • 检测某个键是否存在:通过双赋值,若key在m中,ok为true,否则为false。若key不在m,则elem是该映射元素类型的零值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
elem,ok=map[key]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main (){
    m:=make(map[string]int)
    
    m["answer"]=19
 	m["answer"]=121
    
    delete(m,"answer")
    
    v,ok:=m["answer"]

}

函数值

  • 函数也是值,可以像其他值一样传递
  • 函数值可以作为函数的参数或返回值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func compute (fn func(float64,float64)float64)float64{
    return (fn(3,4))
}
函数的闭包
  • 闭包:能够读取其他函数内部变量的函数
  • Go函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量,该函数可以访问并赋予其引用变量的值,即该函数被这些变量绑定在一起。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
数据结构 第4讲 单链表
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢?可以给每个元素附加一个指针域,指向下一个元素的存储位置。如图所示:
rainchxy
2018/09/13
6700
数据结构 第4讲 单链表
C语言单链表实现初始化、创建、增、删、查等基本操作(详细)
LNode *L ;             //声明一个指向单链表第一个结点的指针 (强调这是一个结点用LNode*)
莫浅子
2022/11/18
1.6K0
单链表
线性表的链式表示和实现       线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以使不连续的)。因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像,称为结点。      结点包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称做指针或链。n
猿人谷
2018/01/17
9760
单链表
单链表基础练习
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR -1 typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; LinkList createlist(LinkList L, int n); //采用尾插法创建链表 LinkList createlist_tail(LinkList L, int
Enterprise_
2019/02/21
5620
单链表(带头结点)
运行结果: 注意:这是带头结点的单链表,所以0号节点是头结点,查找0号结点是可以查找成功的。我并没有给0号节点数据域赋值,根据个人情况去做
别团等shy哥发育
2023/02/25
3660
单链表(带头结点)
两个非递增的有序链表的合并
已知两个带头结点的非递增有序的单链表A和B,设计算法将两个单链表合并成一个非递增有序的单链表C.要求单链表C仍使用原来两个链表的存储空间
别团等shy哥发育
2023/02/27
8720
【数据结构】链表[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115596.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/10
3840
【数据结构】详细剖析线性表
经过这段时间的学习与分享,想必大家跟我一样都已经对线性表的相关内容比较熟悉了。为了更好的巩固线性表相关的知识点,下面我们一起将线性表这个章节的内容梳理一遍吧。
蒙奇D索隆
2024/01/01
2440
【数据结构】详细剖析线性表
【数据结构】C语言实现单链表的基本操作
大家好,很高兴又和大家见面啦!!! 在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单链表,如下所示:
蒙奇D索隆
2023/12/29
6240
【数据结构】C语言实现单链表的基本操作
java算法刷题00——数据结构基础知识回顾
数据、数据元素(如一个账号)、数据项(密码、昵称)、数据结构(具有关系的一组数据元素集合,联想汉字的结构其实就是具有布局关系的符号组合)、数据对象(具有相同性质的数据元素的集合、一家海底捞的排队信息可以看作数据结构、全国所有门店排队信息看做同一个数据对象,它们虽无直接关系,但是具有同样的联系)
半旧518
2022/10/26
2890
c++单链表的基本操作(全)
俩个基本插入方法 #include <bits/stdc++.h> using namespace std; typedef struct LNode { int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 bool Initlist_L(LinkList &L) //构造一个空的单链表L { L = new
莫浅子
2022/11/18
6200
c++单链表的基本操作(全)
数据结构 第4-2讲 双向链表
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢?
rainchxy
2018/09/13
7230
数据结构 第4-2讲 双向链表
数据结构——链表
链式存储结构 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻有关术语 结点:数据元素的存储映像。由数据域和指针域两部分组成 - 数据域:存储元素数值数据 - 指针域:存储直接后继结点的存储位置 链表:n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构 - 单链表 - 结点只有一个指针域的链表,称为单链表或线性链表 - 双链表 - 有两个指针域的链表,称为双链表 - 循环链表 - 首尾相接的链表称为循环链表 头指针
ruochen
2021/06/28
6860
数据结构——链表
数据结构代码题-链表
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
愷龍
2023/10/16
4050
数据结构代码题-链表
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
单链表插入:头插法(往前插入)void head_insert(Node*node,int key)
CtrlX
2022/11/18
1.9K0
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
单链表插入:头插法(往前插入)void head_insert(Node*node,int key)
CtrlX
2023/03/21
1.5K0
【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构
单链表反转的分析及实现
我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。比如下面是第一次交换,我们先让头结点的next域指向结点a2,再让结点a1的next域指向结点a3,最后将结点a2的
猿人谷
2018/01/17
2.3K0
单链表反转的分析及实现
数据结构 单链表&顺序表
根据文章内容总结的摘要
Kindear
2018/01/03
2.7K0
数据结构 单链表&顺序表
【图解数据结构】 线性表
1.线性表的定义 若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
撸码那些事
2018/06/21
1.3K5
数据结构之线性表
所谓顺序表就是顺序存储的线性表。顺序存储是用一组地址连续的存储单元依次存放线性表中各个元素的存储结构。
C语言与CPP编程
2020/12/02
8570
数据结构之线性表
推荐阅读
相关推荐
数据结构 第4讲 单链表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文