当前位置: 首页 > news >正文

Golang学习Day3

😋 大家好,我是YAy_17,是一枚爱好网安的小白。
本人水平有限,欢迎各位师傅指点,欢迎关注 😁,一起学习 💗 ,一起进步 ⭐ 。
⭐ 此后如竟没有炬火,我便是唯一的光。 ⭐

Go语言中的指针

Go语言中的函数传参都是值传递,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量,传递数据使用指针,而无需拷贝数据。

类型指针不能进行偏移和运算。

Go语言中的指针操作非常简单,只需要记住两个符号&(取地址)和*(根据地址取值)

指针地址和指针类型

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行取地址操作。Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如: *int、 *int64、*string等。

指针的语法

一个指针变量指向了一个值的内存地址。(也就是我们声明了一个指针之后,可以像变量赋值一样,把一个值的内存地址放入到指针当中。)类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:

var var _name *var_type

var_type :为指针类型 var_name :为指针变量名 *:用于指定变量是作为一个指针。

package mainimport "fmt"func main() {var p *intfmt.Printf("p: %v\n", p)fmt.Printf("p: %T\n", p)var a int = 100p = &afmt.Printf("p: %v\n", *p)var str *stringfmt.Printf("str: %v\n", str)fmt.Printf("str: %T\n", str)s := "Y4y17"str = &sfmt.Printf("str: %v\n", *str)var bl *boolfmt.Printf("bl: %v\n", bl)fmt.Printf("bl: %T\n", bl)var b bool = truebl = &bfmt.Printf("bl: %v\n", *bl)
}

输出结果为:

指向数组的指针

定义语法

var ptr [MAX]*int //表示数组里面的元素的类型是指针类型

package mainimport "fmt"func main() {a := [3]int{1, 2, 3}var p [3]*intfmt.Printf("p: %v\n", p)for i := 0; i < len(a); i++ {p[i] = &a[i]fmt.Printf("p[i]: %v\n", *p[i])}
}

输出结果为:

Go语言中的类型定义和类型别名

Go语言类型定义

type Newtype Type

package main
import "fmt"func main() {type Myint intvar i Myint = 100fmt.Printf("i: %T,%v\n", i, i)
}

输出结果如下:

i: main.Myint,100

Go语言类型别名

type Newtype=Type
package main
import "fmt"
func main() {type Myint = intvar i Myint = 100fmt.Printf("i: %T,%v\n", i, i)
}
i: int,100

Go语言中的类型定义和类型别名的区别

  1. 类型定义相当于定义了一个全新的类型,与之前的类型不同;但是类型别名并没有定义一个新的类型,而是使用一个别名来替换之前的类型

  1. 类型别名只会在代码中存在,在编译完成之后并不会存在该别名

  1. 因为类型别名和原来的类型是一致的,所以原来类型所拥有的方法,类型别名中也可以调用,但是如果是重新定义的一个类型,那么不可以调用之前的任何方法

Go语言中的结构体

在使用结构体之前我们需要定义一个结构体类型,之后通过定义的这个结构体类型在去定义结构体变量;语法结构如下:

type struct_variable_type struct{
member definition;
member definition;
......
member definition;
}	
type:结构体定义关键字
struct_variable_type:结构体类型名称
member definition:成员定义
package mainimport "fmt"func main() {type person struct {name stringage  intsex  string}var tom personfmt.Printf("tom: %v\n", tom)tom.name = "tom"tom.sex = "man"tom.age = 20fmt.Printf("tom: %v\n", tom)fmt.Printf("tom.name: %v\n", tom.name)
}

输出的结果如下:

匿名结构体

package mainimport "fmt"func main() {var tom struct {	//匿名结构体在定义的时候不再使用type 而是varname stringage  intsex  string}tom.name = "tom"tom.sex = "man"tom.age = 20fmt.Printf("tom: %v\n", tom)fmt.Printf("tom.name: %v\n", tom.name)
}

结构体的初始化

package mainimport "fmt"func main() {type person struct {name, email stringage, id     int}//第一种初始化的方法:键值对的方式var tom persontom = person{name:  "tom",email: "tom@gmail.com",age:   20,id:    111,}fmt.Printf("tom: %v\n", tom)//第二种初始化的方法:列表的方式var Y4y17 personY4y17 = person{//这种初始化的方法,必须按照结构体成员定义的顺序进行初始化"Y4y17","Y4y17@gmail.com",20,16,}fmt.Printf("Y4y17: %v\n", Y4y17)//第三种初始化的方法:支持短变量赋值Mary := person{//部分赋值也是可以的name: "Mary",id:   22,}fmt.Printf("Mary: %v\n", Mary)
}
输出结果如下:
tom: {tom tom@gmail.com 20 111}
Y4y17: {Y4y17 Y4y17@gmail.com 20 16}
Mary: {Mary  0 22}

结构体指针

package mainimport ("fmt"
)
//普通的指针变量
func test1() {var name string = "Y4y17"var nm *stringnm = &namefmt.Printf("name: %v\n", name)fmt.Printf("nm: %v\n", nm)fmt.Printf("nm: %v\n", *nm)
}
//结构体指针
func test2() {type person struct {name stringage  intid   int}var p_struct *person//这里存在3种赋值的方式//第一种方式:p_struct = &person{name: "Y4y17",age:  20,id:   17,}fmt.Printf("p_struct: %v\n", *p_struct)//第二种方式var tom person = person{"tom", 20, 17}var p_struct1 *personp_struct1 = &tomfmt.Printf("p_struct1: %v\n", *p_struct1)//第三种方式:var p_struct2 = new(person)p_struct2.age = 22p_struct2.name = "Mary"fmt.Printf("p_struct2: %v\n", *p_struct2)
}func main() {test2()
}
输出结构如下:
p_struct: {Y4y17 20 17}
p_struct1: {tom 20 17}
p_struct2: {Mary 22 0}

结构体作为函数的参数

package mainimport "fmt"type person struct {name stringage  intid   int
}func show_person(per person) {per.name = "Y4y17"per.age = 24per.id = 17fmt.Printf("per: %v\n", per)
}
func main() {Mary := person{name: "Mary",age:  23,id:   99,}fmt.Printf("Mary: %v\n", Mary)fmt.Printf("--------------------------\n")show_person(Mary)fmt.Printf("Mary: %v\n", Mary)
}
Mary: {Mary 23 99}
--------------------------
per: {Y4y17 24 17}
Mary: {Mary 23 99}
package mainimport "fmt"type person struct {name stringage  intid   int
}func show_person(per *person) {per.name = "Y4y17"per.age = 24per.id = 17fmt.Printf("per: %v\n", *per)
}
func main() {Mary := person{name: "Mary",age:  23,id:   99,}fmt.Printf("Mary: %v\n", Mary)fmt.Printf("--------------------------\n")show_person(&Mary)fmt.Printf("Mary: %v\n", Mary)
}
修改一下代码,使得变成传递地址的方式:
Mary: {Mary 23 99}
--------------------------
per: {Y4y17 24 17}
Mary: {Y4y17 24 17}

结构体的嵌套

package mainimport "fmt"type person struct {name stringage  intid   intcat  cat	//结构体中嵌套着一个cat结构体
}type cat struct {name  stringage   intcolor string
}func main() {cat := cat{name:  "敢敢",age:   1,color: "grey",}Y4y17 := person{name: "Y4y17",age:  23,id:   17,cat:  cat,}fmt.Printf("Y4y17: %v\n", Y4y17)fmt.Printf("Y4y17.cat.name: %v\n", Y4y17.cat.name)
}
Y4y17: {Y4y17 23 17 {敢敢 1 grey}}
Y4y17.cat.name: 敢敢

Go语言中的方法

go语言没有面向对象的特性,也没有类对象的概念。但是,可以使用结构体来模拟这些特性,我们都知道面向;象里面有类方法等概念。我们也可以声明一些方法,属于某个结构体。

Go语言方法的语法

Go中的方法,是一种特殊的函数,定义于struct之上(与struct关联、绑定),被称为struct的接受者(receiver)。通俗的讲,方法就是有接收者的函数。

语法格式如下:
type mytype struct{}
func (recv mytype) my_method( para) return_type {}
func (recv *mytype) my_method(para) return_type {}
mytype :定义一个结构体
recv∶接受该方法的结构体(receiver)my_method:方法名称
para :参数列表
return_type :返回值类型

从语法格式可以看出,一个方法和一个函数非常相似,多了一个接受类型。

package mainimport "fmt"type person struct {name string
}func (per person) eat() {fmt.Printf("%v eating...\n", per.name)
}
func (per person) sleep() {fmt.Printf("%v sleeping...\n", per.name)
}
func main() {var tom persontom.name = "tom"tom.eat()tom.sleep()
}
package mainimport "fmt"type customer struct {name string
}func (cus customer) login(name string, pwd string) bool {if name == "tom" && pwd == "123" {return true} else {return false}
}
func main() {cus := customer{name: "tom",}b := cus.login("tom", "123")fmt.Printf("b: %v\n", b)
}

Go语言方法的注意事项

  1. 方法的receiver type并非一定要是struct类型,type定义的类型别名、slice、map、channel、func类型等都可以。

  1. struct结合它的方法就等价于面向对象中的类。只不过struct可以和它的方法分开,并非一定要属于同一个文件,但必须属于同一个包。

  1. 方法有两种接收类型: (T Type)和(T *Type),它们之间有区别。

  1. 方法就是函数,所以Go中没有方法重载(overload)的说法,也就是说同一个类型中的所有方法名必须都唯一。如果receiver是一个指针类型,则会自动解除引用。

  1. 方法和type是分开的,意味着实例的行为(behavior)和数据存储(field)是分开的,但是它们通过receiver建立起关联关系。

Go语言方法接收者类型

分为值类型和指针类型

package mainimport "fmt"type customer struct {name string
}//传值
func (cus customer) test1() {cus.name = "Y4y17"
}//传递指针
func (cus *customer) test2() {cus.name = "Y4y17"
}
func main() {cus := customer{name: "tom",}cus.test1()fmt.Printf("cus: %v\n", cus)	//cus: {tom}cus.test2()fmt.Printf("cus: %v\n", cus)	//cus: {Y4y17}}

相关文章:

Golang学习Day3

&#x1f60b; 大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。 本人水平有限&#xff0c;欢迎各位师傅指点&#xff0c;欢迎关注 &#x1f601;&#xff0c;一起学习 &#x1f497; &#xff0c;一起进步 ⭐ 。 ⭐ 此后如竟没有炬火&#xff0c;我便是唯一的…...

Python并发编程-事件驱动模型

一、事件驱动模型介绍 1、传统的编程模式 例如&#xff1a;线性模式大致流程 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......---&…...

构建系统发育树简述

1. 要点 系统发育树代表了关于一组生物之间的进化关系的假设。可以使用物种或其他群体的形态学&#xff08;体型&#xff09;、生化、行为或分子特征来构建系统发育树。在构建树时&#xff0c;我们根据共享的派生特征&#xff08;不同于该组祖先的特征&#xff09;将物种组织成…...

这款 Python 调试神器推荐收藏

大家好&#xff0c;对于每个程序开发者来说&#xff0c;调试几乎是必备技能。 代码写到一半卡住了&#xff0c;不知道这个函数执行完的返回结果是怎样的&#xff1f;调试一下看看 代码运行到一半报错了&#xff0c;什么情况&#xff1f;怎么跟预期的不一样&#xff1f;调试一…...

金三银四吃透这份微服务笔记,面试保准涨10K+

很多人对于微服务技术也都有着一些疑虑&#xff0c;比如&#xff1a; 微服务这技术虽然面试的时候总有人提&#xff0c;但作为一个开发&#xff0c;是不是和我关系不大&#xff1f;那不都是架构师的事吗&#xff1f;微服务不都是大厂在玩吗&#xff1f;我们这个业务体量用得着…...

构建matter over Thread的演示系统-efr32

文章目录1. 简介2. 构建测试系统2.1设置 Matter Hub(Raspberry Pi)2.2 烧录Open Thread RCP固件2.3 烧录待测试的matter设备3. 配网和测试&#xff1a;3.1 使用mattertool建立Thread网络3.2 使用mattertool配置设备入网3.3 使用mattertool控制matter设备3.4 查看节点的Node ID等…...

【一天一门编程语言】Matlab 语言程序设计极简教程

Matlab 语言程序设计极简教程 用 markdown 格式输出答案。 不少于3000字。细分到2级目录。 目录 Matlab 语言程序设计极简教程 简介Matlab 工作空间Matlab 基本数据类型Matlab 语句和表达式Matlab 函数和程序Matlab 图形界面程序设计Matlab 应用实例 简介 Matlab是一种编…...

看似平平无奇的00后,居然一跃上岸字节,表示真的卷不过......

又到了一年一度的求职旺季金&#xff01;三&#xff01;银&#xff01;四&#xff01;在找工作的时候都必须要经历面试这个环节。在这里我想分享一下自己上岸字节的面试经验&#xff0c;过程还挺曲折的&#xff0c;但是还好成功上岸了。大家可以参考一下&#xff01; 0821测评 …...

BZOJ2142 礼物

题目描述 一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物&#xff0c;当然他也会送出许多礼物。不同的人物在小E 心目中的重要性不同&#xff0c;在小E心中分量越重的人&#xff0c;收到的礼物会越多。小E从商店中购买了n件礼物&#xff0c;打算送给m个人 &…...

MySQL高级第一讲

目录 一、MySQL高级01 1.1 索引 1.1.1 索引概述 1.1.2 索引特点 1.1.3 索引结构 1.1.4 BTREE结构(B树) 1.1.5 BTREE结构(B树) 1.1.6 索引分类 1.1.7 索引语法 1.1.8 索引设计原则 1.2 视图 1.2.1 视图概述 1.2.2 创建或修改视图 1.3 存储过程和函数 1.3.1 存储过…...

前端面试常用内容——基础积累

1.清除浮动的方式有哪些&#xff1f; 高度塌陷&#xff1a;当所有的子元素浮动的时候&#xff0c;且父元素没有设置高度&#xff0c;这时候父元素就会产生高度塌陷。 清除浮动的方式&#xff1a; 1.1 给父元素单独定义高度 优点&#xff1a; 快速简单&#xff0c;代码少 缺…...

跟着《代码随想录》刷题(三)——哈希表

3.1 哈希表理论基础 哈希表理论基础 3.2 有效的字母异位词 242.有效的字母异位词 C bool isAnagram(char * s, char * t){int array[26] {0};int i 0;while (s[i]) {// 并不需要记住字符的ASCII码&#xff0c;只需要求出一个相对数值就可以了array[s[i] - a];i;}i 0;whi…...

HTML - 扫盲

文章目录1. 前言2. HTML2.1 下载 vscode3 HTML 常见标签3.1 注释标签3.2 标题标签3.3 段落标签3.4 换行标签3.5 格式化标签1. 加粗2. 倾斜3. 下划线3.6 图片标签3.7 超链接标签3.8 表格标签3.9 列表标签4. 表单标签4.1 from 标签4.2 input 标签4.3 select 标签4.4 textarea标签…...

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题&#xff08;25分&#xff09;2022上案例分析历年真题第二题&#xff08;25分&#xff09;2022上案例分析历年真题第…...

Python编程规范

Python编程规范 当今Python编程社区有许多关于编程规范的约定和惯例。以下是一些常见的Python编程规范&#xff1a; 1.使用有意义的命名 使用有意义的命名可以使代码更加清晰、易读、易维护。变量、函数、类和模块的命名应该能够明确传达其用途&#xff0c;而不是使用无意义…...

【Java】Spring Boot项目的创建和使用

文章目录SpringBoot的创建和使用1. 什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f;2. Spring Boot项目的优点3. Spring Boot 项目的创建3.1 使用idea创建3.2 接下来创建Spring Boot项目4. 项目目录介绍和运行4.1 运行项目4.2 输出内容5. 总结SpringBoot的创建…...

Malware Dev 00 - Rust vs C++ 初探

写在最前 如果你是信息安全爱好者&#xff0c;如果你想考一些证书来提升自己的能力&#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a; https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助&#xff0c;并分享学习和实践过程…...

JavaScript HTML DOM 事件

文章目录JavaScript HTML DOM 事件对事件做出反应HTML 事件属性使用 HTML DOM 来分配事件onload 和 onunload 事件onchange 事件onmouseover 和 onmouseout 事件onmousedown、onmouseup 以及 onclick 事件JavaScript HTML DOM 事件 HTML DOM 使 JavaScript 有能力对 HTML 事件做…...

推荐算法——NCF知识总结代码实现

NCF知识总结代码实现1. NeuralCF 模型的结构1.1 回顾CF和MF1.2 NCF 模型结构1.3 NeuralCF 模型的扩展---双塔模型2. NCF代码实现2.1 tensorflow2.2 pytorchNeuralCF&#xff1a;如何用深度学习改造协同过滤&#xff1f; 随着技术的发展&#xff0c;协同过滤相比深度学习模型的…...

redis(4)String字符串

前言 Redis中有5大数据类型&#xff0c;分别是字符串String、列表List、集合Set、哈希Hash、有序集合Zset&#xff0c;本篇介绍Redis的字符串String Redis字符串 String是Redis最基本的类型&#xff0c;你可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...