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

Go 自学:变量、函数、结构体、接口、错误处理

1. 打印变量数据类型

package mainimport "fmt"func main() {penniesPerText := 2.0fmt.Printf("The type of penniesPerText is %T\n", penniesPerText)
}

输出为:
The type of penniesPerText is float64

2. 同时给多个变量赋值

package mainimport "fmt"func main() {averageOpenRate, displayMessage := .23, "is the average open rate of your message."fmt.Println(averageOpenRate, displayMessage)
}

3. 条件句

package mainimport "fmt"func main() {messageLen := 10maxMessageLen := 20fmt.Println("Trying to send message of length:", messageLen, "and a max length of:", maxMessageLen)if messageLen <= maxMessageLen {fmt.Println("Message sent")} else {fmt.Println("Message not sent")}
}

输出为:
Trying to send message of length: 10 and a max length of: 20
Message sent

4. 忽略返回值

注意:Go不允许存在未经使用的变量。使用“_”忽略函数返回值。

package mainimport "fmt"func main() {firstName, _ := getNames()fmt.Println("Welcome to Earth,", firstName)}func getNames() (string, string) {return "John", "Doe"
}

5. STRUCTS

我们使用struct去建立一个key-value的结构。

package mainimport "fmt"type messageToSend struct {phoneNumber intmessage     string
}func test(m messageToSend) {fmt.Printf("Sending message: '%s' to: %v\n", m.message, m.phoneNumber)
}func main() {test(messageToSend{phoneNumber: 148255510981,message:     "Thanks for signing up",})}

6. Embedded STRUCTS

embedded struct可以实现类似继承的效果。

package mainimport "fmt"type sender struct {rateLimit intuser
}type user struct {name   stringnumber int
}func test(s sender) {fmt.Println("Sender name: ", s.name)fmt.Println("Sender number: ", s.number)fmt.Println("Sender rate limit: ", s.rateLimit)
}func main() {test(sender{rateLimit: 10000,user: user{name:   "Deborah",number: 18055558790,},})
}

7. STRUCTS method

package mainimport "fmt"type authenticationInfo struct {username stringpassword string
}func (authI authenticationInfo) getBasicAuth() string {return fmt.Sprintf("Authorization: Basic %s:%s", authI.username, authI.password)
}func test(authInfo authenticationInfo) {fmt.Println(authInfo.getBasicAuth())
}func main() {test(authenticationInfo{username: "Bing",password: "98725",})
}

8. Interface接口

接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。

package mainimport ("fmt""time"
)func sendMessage(msg message) {fmt.Println(msg.getMessage())
}type message interface {getMessage() string
}type birthdayMessage struct {birthdayTime  time.TimerecipientName string
}func (bm birthdayMessage) getMessage() string {return fmt.Sprintf("Hi %s, it is your birthday on %s", bm.recipientName, bm.birthdayTime)
}type sendingReport struct {reportName    stringnumberOfSends int
}func (sr sendingReport) getMessage() string {return fmt.Sprintf("Your '%s' report is ready. You've sent %v messages.", sr.reportName, sr.numberOfSends)
}func test(m message) {sendMessage(m)
}func main() {test(sendingReport{reportName:    "First Report",numberOfSends: 10,})test(birthdayMessage{recipientName: "John Doe",birthdayTime:  time.Date(1994, 03, 21, 0, 0, 0, 0, time.UTC),})
}

输出为:
Your ‘First Report’ report is ready. You’ve sent 10 messages.
Hi John Doe, it is your birthday on 1994-03-21 00:00:00 +0000 UTC

Interface接口的另一个例子

package mainimport ("fmt"
)type employee interface {getName() stringgetSalary() int
}type contractor struct {name         stringhourlyPay    inthoursPerYear int
}func (c contractor) getName() string {return c.name
}func (c contractor) getSalary() int {return c.hourlyPay * c.hoursPerYear
}type fullTime struct {name   stringsalary int
}func (f fullTime) getName() string {return f.name
}func (f fullTime) getSalary() int {return f.salary
}func test(e employee) {fmt.Println(e.getName(), e.getSalary())
}func main() {test(fullTime{name:   "Jack",salary: 50000,})test(contractor{name:         "Bob",hourlyPay:    100,hoursPerYear: 73,})
}

输出为:
Jack 50000
Bob 7300

9. 实现多个Interface

package mainimport ("fmt"
)type expense interface {cost() float64
}type printer interface {print()
}type email struct {isSubscribed boolbody         string
}func (e email) cost() float64 {if !e.isSubscribed {return 0.05 * float64(len(e.body))}return 0.01 * float64(len(e.body))
}func (e email) print() {fmt.Println(e.body)
}func test(e expense, p printer) {fmt.Printf("Printing with cost: %f\n", e.cost())p.print()fmt.Println("================================")
}func main() {e := email{isSubscribed: true,body:         "hello there",}test(e, e)e = email{isSubscribed: false,body:         "I want my money back",}test(e, e)
}

10. Type assertions类型断言

通过这一行代码“em, ok := e.(email)”,检查输入是否为email。
通过这一行代码“s, ok := e.(sms)”,检查输入是否为sms。

package mainimport ("fmt"
)type expense interface {cost() float64
}func getExpenseReport(e expense) (string, float64) {em, ok := e.(email)if ok {return em.toAddress, em.cost()}s, ok := e.(sms)if ok {return s.toPhoneNumber, s.cost()}return "", 0.0
}type email struct {isSubscribed boolbody         stringtoAddress    string
}type sms struct {isSubscribed  boolbody          stringtoPhoneNumber string
}func (e email) cost() float64 {if !e.isSubscribed {return float64(len(e.body)) * .05}return float64(len(e.body)) * .01
}func (s sms) cost() float64 {if !s.isSubscribed {return float64(len(s.body)) * .1}return float64(len(s.body)) * .03
}func test(e expense) {fmt.Println(getExpenseReport(e))
}func main() {test(email{isSubscribed: true,body:         "hello there",toAddress:    "john@dose.com",})test(sms{isSubscribed:  false,body:          "This meeting could have been an email",toPhoneNumber: "+155555509832",})
}

11. Type Switches

可以利用switch语法改写以上代码,令程序可以根据不同输入类型,有不一样的输出。

func getExpenseReport(e expense) (string, float64) {switch v := e.(type) {case email:return v.toAddress, v.cost()case sms:return v.toPhoneNumber, v.cost()default:return "", 0.0}
}

12. 如何处理error

package mainimport ("fmt"
)func sendSMSToCouple(msgToCustomer, msgToSpouse string) (float64, error) {costForCustomer, err := sendSMS(msgToCustomer)if err != nil {return 0.0, err}costForSpouse, err := sendSMS(msgToSpouse)if err != nil {return 0.0, err}return costForCustomer + costForSpouse, nil
}func sendSMS(message string) (float64, error) {const maxTextLen = 25const costPerchar = .0002if len(message) > maxTextLen {return 0.0, fmt.Errorf("can't send texts over %v characters", maxTextLen)}return costPerchar * float64(len(message)), nil
}func test(msgToCustomer, msgToSpouse string) {defer fmt.Println("=========")fmt.Println("Message for customer:", msgToCustomer)fmt.Println("Message for spouse:", msgToSpouse)totalCost, err := sendSMSToCouple(msgToCustomer, msgToSpouse)if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Total cost: $%.4f\n", totalCost)
}func main() {msgToCustomer_1 := "Thank you."msgToSpouse_1 := "Enjoy!"test(msgToCustomer_1, msgToSpouse_1)msgToCustomer_1 = "We loved having you in."msgToSpouse_1 = "We hope the rest of your evening is absolutely interesting."test(msgToCustomer_1, msgToSpouse_1)
}

输出为:
Message for customer: Thank you.
Message for spouse: Enjoy!
Total cost: $0.0032

Message for customer: We loved having you in.
Message for spouse: We hope the rest of your evening is absolutely interesting.
Error: can’t send texts over 25 characters

相关文章:

Go 自学:变量、函数、结构体、接口、错误处理

1. 打印变量数据类型 package mainimport "fmt"func main() {penniesPerText : 2.0fmt.Printf("The type of penniesPerText is %T\n", penniesPerText) }输出为&#xff1a; The type of penniesPerText is float64 2. 同时给多个变量赋值 package mai…...

pyqt Pyton VTK 使用 滑块 改变 VTK Actor 颜色

使用 PyQt5 vtk vtk球体 使用滑块 RGB 改变 Actor 颜色 CODE import sys from PyQt5.QtWidgets import * from PyQt5.QtWidgets import (QApplication, QCheckBox, QGridLayout, QGroupBox,QMenu, QPushButton, QRadioButton, QVBoxLayout, QWidget, QSlider,QLineEdit,QLabe…...

春秋云镜 CVE-2019-16113

春秋云镜 CVE-2019-16113 Bludit目录穿越漏洞 靶标介绍 在Bludit<3.9.2的版本中&#xff0c;攻击者可以通过定制uuid值将文件上传到指定的路径&#xff0c;然后通过bl-kernel/ajax/upload-images.php远程执行任意代码。 启动场景 漏洞利用 exp https://github.com/Kenun…...

【JavaEE基础学习打卡06】JDBC之进阶学习PreparedStatement

目录 前言一、PreparedStatement是什么二、重点理解预编译三、PreparedStatement基本使用四、Statement和PreparedStatement比较1.PreparedStatement效率高2.PreparedStatement无需拼接参数3.PreparedStatement防止SQL注入 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学…...

Postgresql12基于时间点恢复

1、环境 centos 7系统 postgresql 12 docker 20.10.6 2、整体思路 1&#xff09;进行一个pgdata目录的全量备份 2&#xff09;通过wal日志恢复到故障发生之前某个时间点 3、操作步骤 配置postgresql.conf文件 #日志级别 wal_level replica #归档开关 archive_mode on …...

【MySQL系列】Select语句单表查询详解(二)ORDERBY排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

C++学习第十九天----简单文件输入/输出和今日工作问题

1.写入到文本文件中 cout用于控制台输出&#xff1b; 必须包含头文件iostream&#xff1b; 头文件iostream定义了一个用于处理输出的ostream类&#xff1b; 头文件iostream声明了一个名为cout的ostream变量&#xff08;对象&#xff09;&#xff1b; 必须指明名称空间std&…...

基于风险的漏洞管理

基于风险的漏洞管理涉及对即将被利用的漏洞的分类响应&#xff0c;如果被利用&#xff0c;可能会导致严重后果。本文详细介绍了确定漏洞优先级时要考虑的关键风险因素&#xff0c;以及确保基于风险的漏洞管理成功的其他注意事项。 什么是基于风险的漏洞管理对基于风险的漏洞管…...

命令行——Git基本操作总结

介绍 我们的操作使用的是客户端TortoiseGit 操作的git ,实际上底层依旧是使用的命令行帮我们执行, 在早期 git 并没有窗口化工具,开发人员只能使用命令行模式 实际上,如果你掌握并熟练使用了命令行模式操作git 的话,你会发现某些操作命令行比窗口化操作要简单 所有你在工作中…...

验证评估守护关基安全 赛宁数字孪生靶场创新实践

​​近日&#xff0c;由赛宁网安主办&#xff0c;ISC互联网安全大会组委会协办的第十一届互联网安全大会&#xff08;ISC 2023&#xff09;安全运营实践论坛圆满结束。赛宁网安产品总监史崯出席并作出主题演讲&#xff1a;《基于数字孪生靶场如何开展验证评估》&#xff0c;同时…...

R语言09-R语言中的字符函数和分布相关函数

字符函数 paste() 和 paste0(): 将多个字符向量连接成一个字符串&#xff0c;paste0() 直接连接&#xff0c;而 paste() 可以通过 sep 参数指定分隔符。 vector1 <- c("Hello", "world") vector2 <- c("R", "programming") re…...

pnpm无法加载文件 (解决方法 )

现在要运行一个TS的项目&#xff0c;我的电脑上没有安装pnpm&#xff0c;导致我的vscode一直报错无法加载。 pnpm安装&#xff1a; npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁止运…...

做一个蛋糕店小程序需要哪些步骤?

对于一些不懂技术的新手来说&#xff0c;创建蛋糕店小程序可能会感到有些困惑。但是&#xff0c;有了乔拓云平台的帮助&#xff0c;你可以轻松地创建自己的蛋糕店小程序。下面&#xff0c;我将为大家详细介绍一下具体的操作步骤。 首先&#xff0c;登录乔拓云平台并进入后台管理…...

Docker的革命:容器技术如何重塑软件部署之路

引言 在过去的几年中&#xff0c;容器技术已经从一个小众的概念发展成为软件开发和部署的主流方法。Docker&#xff0c;作为这一变革的先驱&#xff0c;已经深深地影响了我们如何构建、部署和运行应用程序。本文将探讨容器技术的起源&#xff0c;Docker如何崛起并改变了软件部…...

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…...

Linux驱动开发:技术、实践与Linux的历史

一、引言 Linux&#xff0c;这个开源的操作系统&#xff0c;已经在全球范围内赢得了开发者和企业的广泛支持。它的强大之处在于其内核以及无数的驱动程序&#xff0c;这些驱动程序使得各种硬件设备可以在Linux操作系统上运行。本篇文章将深入探讨Linux驱动开发&#xff0c;包括…...

# Go学习-Day5

文章目录 map增加和更新删除查询遍历&#xff08;for-range&#xff09;map切片关于哈希表遍历的一点看法对map的key排序 结构体与OOP声明、初始化、序列化方法工厂模式 个人博客&#xff1a;CSDN博客 map map是一个key-value的数据结构&#xff0c;又称为字段或关联数组 Gol…...

创建型(二) - 单例模式

一、概念 单例设计模式&#xff08;Singleton Design Pattern&#xff09;&#xff1a;一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类。 优点&#xff1a;在内存里只有一个实例&#xff0c;减少了内存的开销&#xff0c;避免…...

基于swing的图书借阅管理系统java jsp书馆书籍信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的图书借阅管理系统 系统有2权限&#xff1…...

Android相机-HAL-Rockchip-hal3

引言&#xff1a; 对于Android相机的 HAL层而言对上实现一套Framework的API接口&#xff0c;对下通过V4L2框架实现与kernel的交互。不同的平台会有不同的实现方案。主要是对Android HAL3的接口的实现。看看rockchip是怎么支持hal3的&#xff1f; 代码目录&#xff1a; hardw…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...