Golang基础5-指针、结构体、方法、接口

指针

和c/c++类似,但是go语言中指针不能进行偏移和运算,安全指针

&(取地址) *(根据地址取值)

nil(空指针)

make和new之前对比:make用于初始化slice,map,channel这样的引用类型

而new用于类型的内存分配,分配的值为类型0值,返回该类型指针

结构体

值传递

没有继承,但是可以通过组合来支持面向对象特性。

结构体中可以包括结构体,但是不能包括本身

简单demo

package mainimport "fmt"type person struct {name stringcity stringage  int8
}func main() {//创建变量var p1 personp1.name = "pprof.cn"p1.city = "北京"p1.age = 18fmt.Printf("p1=%v\n", p1)  //p1={pprof.cn 北京 18}fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"pprof.cn", city:"北京", age:18}var p2 = new(person)p2.name = "小明"p2.city = "武汉"p2.age = 10fmt.Printf("p2=%v\n", p2)fmt.Printf("p2=%#v\n", p2)//匿名结构体var user struct {Name stringAge  int}//user := struct{//    Name string//    Age  int//}user.Name = "pprof.cn"user.Age = 18fmt.Printf("%#v\n", user)
}

注意可见性,如果变量名首字母大写,在其他包可以访问(类似于public),否则只能在相同package中访问。

结构体的嵌套

对于Student中匿名嵌套的话,输出对应值,不需要s.p

package mainimport "fmt"type Person struct {name stringage  int
}// Student 结构体嵌套和匿名嵌套
type Student struct {p      Personschool stringscore  int
}func main() {s := Student{p:      Person{name: "张三", age: 18},school: "武汉大学",score:  100,}fmt.Println(s.p.name)
}

方法

    • 绑定对象实例,只能为当前包内命名类型定义方法

方法定义:

   func (recevier type) methodName(参数列表)(返回值列表){}参数和返回值可以省略
    • 参数recevier任意命名,若方法未曾使用可省略参数名
    • receive可以是T和*T类型。T不能是接口
    • 不支持方法重载
    • 可以使用value或pointer调用全部方法,编译器自动转换

简单demo

receive的类型T和*T之间对比

package mainimport "fmt"// 结构体
type User struct {Name  stringEmail string
}// 假设T,产生副本不影响原变量
func (u User) Notify() {fmt.Printf("&u = %p\n", &u)fmt.Println("User 通知消息给", u.Name, " 邮箱为:", u.Email)u.Email = "Notify"
}//如果是*T,传入指针,就会影响u1
//func (u *User) Notify() {
//    fmt.Printf("u = %p\n", u)
//    fmt.Println("User 通知消息给", u.Name, " 邮箱为:", u.Email)
//    u.Email = "Notify"
//}func main() {u1 := User{"user1", "user1.com"}fmt.Printf("&u1 = %p\n", &u1)u1.Notify()//u2 := &u1fmt.Println(u1) //不影响u1变量fmt.Println("*********")u2 := &User{"user2", "user2.com"}fmt.Printf("u2 = %p\n", u2)u2.Notify()fmt.Println(u2)}

func (u User) Notify() 方法时输出,传递副本因此地址不同,修改u不影响mian函数的对象值

func(u *User)Notify()传递指针,影响对象变量的值。

总结:方法就是与特定类型关联的函数,方便相当于c++当中class中的成员函数。

匿名字段demo

通过组合实现于override继承之后覆盖方法的效果。

// 结构体
type User struct {Name  stringEmail string
}type Manager struct {UserStage string
}// User的方法
func (u *User) ToString() string {return fmt.Sprintf("%s %s\n", u.Name, u.Email)
}// Manager的方法
func (m *Manager) ToString() string {return fmt.Sprintf("%s %s %s\n", m.Name, m.Email, m.Stage)
}func main() {m := Manager{User: User{"李四", "manage.cn"}, Stage: "经理"}fmt.Println(m.ToString())fmt.Println(m.User.ToString())
}

接口

参考链接:https://www.cnblogs.com/chenny7/p/4497969.html

go语言接口详解:Go 语言接口的原理 | Go 语言设计与实现

interface抽象类型,是一组method的集合,类似于c++中的纯虚函数,如果一个类/对实现了interface中的所有方法就实现了interface接口。通过interface也就是可以实现多态特性。

简单demo

package mainimport "fmt"type Human struct {name  stringage   intphone string
}type Student struct {Human  //匿名字段school stringloan   float32
}type Employee struct {Human   //匿名字段company stringmoney   float32
}// Human实现SayHi方法
func (h Human) SayHi() {fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}// Human实现Sing方法
func (h Human) Sing(lyrics string) {fmt.Println("La la la la...", lyrics)
}// Employee重载Human的SayHi方法
func (e Employee) SayHi() {fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,e.company, e.phone)
}//func (s Student) SayHi() {
//    fmt.Printf("Hi, I am %s, I study in %s. Loan is %f\n", s.name,
//        s.school, s.loan)
//}
//func (s Student) Sing(lyrics string) {
//    fmt.Println("student Sing")
//}// Interface Men被Human,Student和Employee实现
// 因为这三个类型都实现了这两个方法
type Men interface {SayHi()Sing(lyrics string)
}func main() {mike := Student{Human{"Mike", 25, "222-222-XXX"}, "MIT", 0.0}paul := Student{Human{"Paul", 26, "111-222-XXX"}, "Harvard", 100}sam := Employee{Human{"Sam", 36, "444-222-XXX"}, "Golang Inc.", 1000}tom := Employee{Human{"Tom", 37, "222-444-XXX"}, "Things Ltd.", 5000}//定义Men类型的变量ivar i Men//i能存储Studenti = mikefmt.Println("This is Mike, a Student:")i.SayHi()i.Sing("November rain")//i也能存储Employeei = tomfmt.Println("This is tom, an Employee:")i.SayHi()i.Sing("Born to be wild")//定义了slice Menfmt.Println("Let's use a slice of Men and see what happens")x := make([]Men, 3)//这三个都是不同类型的元素,但是他们实现了interface同一个接口x[0], x[1], x[2] = paul, sam, mikefor _, value := range x {value.SayHi()}
}

通过调用接口相当于实现了多态。

可以继续实现嵌入接口。

空接口demo

空interface(interface{})不包含任何的method

所有的类型都实现了空interface

空接口可以存储任意类型

空interface对于描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。

    // 定义a为空接口,作为函数参数,或者与slice,map等增强灵活性var a interface{}var i int = 5s := "Hello world"// a可以存储任意类型的数值a = ia = s

interface{}可断言类型

空接口断言demo

package mainimport "fmt"type Human struct {Name stringAge  int
}type Student struct {HumanSchool string
}// 作为函数形参
func Show(a interface{}) {fmt.Printf("type of:%T value:%v\n", a, a)
}//判断当前类型
func JustifyType(i interface{}) {switch v := i.(type) {case string:fmt.Println("当前传入为string:", v)case int:fmt.Println("当前传入为int:", v)case Student:fmt.Println("当前为Student类型", v)default:fmt.Println("暂未预料")}
}func main() {i := "hello"Show(i)JustifyType(i)j := 10Show(j)JustifyType(j)Show(123)JustifyType(123)h := Human{"Human", 123}Show(h)JustifyType(h)k := Student{}Show(k)JustifyType(k)}

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

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

相关文章

Metasploit Framework(MSF)从入门到实战(一)

MSF的简介 目前最流行、最强大、最具扩展性的渗透测试平台软件 基于Metasploit进行渗透测试和漏洞分析的流程和方法 2003年由HD More发布第一版,2007年用ruby语言重写 架集成了渗透测试标准 (PETS) 思想 一定程度上统一了渗透测试和漏洞研究的工作环…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头,短焦镜头看到的视野更广阔,同样距…

白平衡简介

文章目录 白平衡的概念白平衡的调节常见的白平衡模式 白平衡的概念 白平衡是指摄影、摄像和显示技术中的一项重要概念,用于调节图像中的白色或中性灰色的色彩,使其看起来在不同光源条件下都是准确的白色或灰色。白平衡的主要目的是确保图像的色彩准确性…

C语言 | Leetcode C语言题解之第49题字母异位词分组

题目: 题解: /*1.将字符串原串与副本进行绑定成一个节点2.对字符串副本进行按ascii码表进行从小到大排序3.按照字符串进行比较排序4.合并 */ typedef struct Node{char*s;char*s_vice;int len; }Node;void sortShellChar(char*s,int len){for(int dista…

查找总价格为目标值的两个商品 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将每两个的和都算出来, 判断是否为目标值解法二: 数组中的数是按升序排序的, 我们可以定义左右指针 如果和小于目标值, 则应该让和变大, 所以左指针右移如果和大于目标值, 则应该让和变小, 所以右指针左移 思路: 定义left 0, righ…

绝地求生【商城更新】WIA联名上架//专属商店下架

大家好,我是闲游盒. 本周商城将在4.24(周三)更新,商城内容更新如下: 上架物品 ▲W.I.A联名皮肤大礼包 小礼包如下: 包含3套衣服以及MINI、DBS的联名皮肤,3个头饰还挺有特色的,你喜欢…

链栈算法库构建

学习贺利坚老师, 链栈 , 构建链栈算法库 数据结构之自建算法库——链栈_领会链栈结构和掌握链栈中的各种基本算法-CSDN博客文章浏览阅读3.9k次,点赞3次,收藏8次。本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

【zabbix7】新版本尝鲜之connector

zabbix历史版本中,会使用python脚本,把zabbix的告警发送到kafka进行二次处理,或者使用filebeat把zabbix的Export的njson指标数据发送到kafka进行二次处理,然而在zabbix7中新增了新功能connector简化了操作并且可以根据tag进行区分…

详解Al作画算法原理

ChatGPT AI作画算法,又称为AI图像生成算法,是一种人工智能技术,它可以根据给定的输入自动生成图像。这类算法近年来变得非常流行,尤其是随着深度学习技术的发展。这里我将聚焦于目前最先进的一类AI作画算法,即生成对抗…

C++:构造函数与析构函数

目录 构造函数 构造函数的概念 析构函数的作用 自定义构造函数与默认构造函数 自定义构造函数 默认构造函数 调用自定义构造函数 析构函 自定义析构函数和默认构造函数 自定义构造函数 默认析构函数 构造函数 构造函数的概念 我们通常的函数是都需要有返回值的,但…

布局香港之零售小店篇 | 香港一人小企与连锁超市的竞争

近年来,内地品牌入驻香港市场开拓业务已成大势所趋。香港特区政府早前公布的「2023年有香港境外母公司的驻港公司按年统计调查」显示,2023年母公司在海外及内地的驻港公司数量高达9039家。内地品牌在香港的成功落地,不仅为香港市民带来了丰富…

【第3节】“茴香豆“:搭建你的 RAG 智能助理

目录 1 基础知识1.1.RAG技术的概述1.2 RAG的基本结构有哪些呢?1.3 RAG 工作原理:1.4 向量数据库(Vector-DB ):1.5 RAG常见优化方法1.6RAG技术vs微调技术 2、茴香豆介绍2.1应用场景2.2 场景难点2.3 茴香豆的构建: 3 论文快读 1 基础…

01.JAVAEE初阶之计算机如何工作

1.一台机器如何组成 冯诺依曼体系 CPU 中央处理器: 进行算术运算和逻辑判断.存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)输入设备: 用户给计算机发号施令的设备.输出设备: 计算机个用户汇报结果的设备. 针对存储空间 硬盘 > 内存 >> CPU针对数据访问…

十大排序算法详解-上篇:比较排序算法【python 动态图解】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

nginx 配置 SSL 证书实现 https 访问

nginx 配置SSL证书实现https访问 1. SSL 证书简介与获取1.1 SSL 证书介绍1.2 获取 SSL 证书 2. nginx 配置 SSL 文件2.1 SSL 文件放置与配置文件修改2.1.1 文件配置2.1.2 强制 https 访问 2.2 验证配置结果 同步发布在个人笔记 nginx 配置 SSL 证书实现 https 访问 配置好 ngi…

LabVIEW和MES系统的智能化车间数据对接

LabVIEW和MES系统的智能化车间数据对接 随着工业4.0时代的到来,智能制造成为推动制造业高质量发展的重要手段。其中,数字化车间作为智能制造的重要组成部分,其设计与实现至关重要。在数字化车间环境下,如何利用LabVIEW软件与MES系…

求最小公倍数

两种方法 1.直接求 import java.util.Scanner;/*** HJ108 求最小公倍数 - 简单*/ public class HJ108 {public static void main(String[] args) {Scanner sc new Scanner(System.in);while(sc.hasNextInt()){int n1 sc.nextInt();int n2 sc.nextInt();for(int i 1; i &l…

OAuth2、JWT

文章目录 OAuth2JWT OAuth2 官网: https://oauth.net/2/ 在 RFC 6749 中说明 1、资源所有者 resource owner, 如 github 用户 2、客户端/第三方应用 client, 如 支持github 登录的 csdn 3、资源服务器 resource server, 如 4、授…

【高阶数据结构】B树 {B树的概念;B树的实现:节点设计,查找,插入,遍历,删除;B树的性能分析;B+树和B*树;B树的应用}

一、常见的搜索结构 以上结构适合用于数据量相对不是很大,能够一次性存放在内存中,进行数据查找的场景。如果数据量很大,比如有100G数据,无法一次放进内存中,那就只能放在磁盘上了,如果放在磁盘上&#xff…