go语言学习笔记1

go语言简介

​ GoLang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性,还可以发挥多核处理器同步多工的优点,并可解决面向对象程序设计的麻烦,并帮助程序设计师处理琐碎但重要的内存管理问题。相比于其他编程语言,简洁、快速、安全、并行、有趣、开源、内存管理、数组安全、编译迅速是其特色。

go语言特性

Go语言作为一门全新的静态类型开发语言具有以下的几种特性:

  1. 内置并发编程支持:

    ​ 使用协程(goroutine) 做为基本的计算单元。 轻松地创建协程。

    ​ 使用通道(channel) 来实现协程间的同步和通信。

  2. 内置了映射(map) 和切片(slice) 类型 。

  3. 支持多态(polymorphism)。

  4. 使用接口(interface) 来实现装盒(value boxing) 和反射(reflection)。

  5. 支持指针。

  6. 支持函数闭包(closure) 。

  7. 支持方法。

  8. 支持延迟函数调用(defer) 。

  9. 支持类型内嵌(type embedding) 。

  10. 支持类型推断(type deduction or type inference) 。

  11. 内存安全。

  12. 自动垃圾回收。

  13. 良好的代码跨平台性。

Go程序生成的二进制可执行文件常常拥有以下优点:

  1. 内存消耗少
  2. 执行速度快
  3. 启动快

最简单的程序

package main
import "fmt"// 我们需要使用fmt包中的Println()函数func main() {
fmt.Println("Hello, world. 你好,世界! ")
}

go语言常用的命令

Go官方工具链工具要求所有的Go源代码文件必须以.go后缀结尾,假设上面展示的最简单的Go程序存放在一个名叫simplest-go-program.go的文件中。打开一个终端(控制台) 并进入上述源文件所在的目录, 然后运行

go run simplest-go-program.go

如果代码中有语法错误, 这些错误将输出在终端中。

注意:

  1. go run子命令并不推荐在正式的大项目中使用。 go run子命令只是一种方便的方式来运行简单的Go程序。 对于正式的项目, 最好使用go build或者go install子命令构建可执行程序文件来运行Go程序。
  2. 支持Go模块特性的Go项目的根目录下需要一个go.mod文件。 此文件可以使用go mod init子命令来生成。

其他命令

  • go vet子命令可以用来检查可能的代码逻辑错误(即警告)。

  • go fmt子命令来用同一种代码风格格式化Go代码。

  • go test子命令来运行单元和基准测试用例。

  • go doc子命令来(在终端中) 查看Go代码库包的文档。

  • go mod init example.com/myproject命令可以用来在当前目录中生成一个go.mod文件。 当前目录将被视为一个名为example.com/myproject的模块(即当前项目) 的根目录。

  • go mod tidy命令用来通过扫描当前项目中的所有代码来添加未被记录的依赖至go.mod文件或从go.mod文件中删除不再被使用的依赖。

  • go get命令用拉添加、 升级、 降级或者删除单个依赖。 此命令不如go mod tidy命令常用。

指针

go语言与C语言和C++语言一样也支持指针,但是Go中的指针相比C指针有很多限制 。一个指针变量指向了一个值的内存地址。类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:

var var_name *var-type

var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。以下是有效的指针声明:

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */

指针类型和值

一个非定义指针类型的字面形式为T, 其中T为一个任意类型。 类型T称为指针类型T的基类型(base type) 。 如果一个指针类型的基类型为T, 则我们可以称此指针类型为一个T指针类型

*int // 一个基类型为int的非定义指针类型。
**int // 一个多级非定义指针类型, 它的基类型为*int。
type Ptr *int // Ptr是一个定义的指针类型, 它的基类型为int。
type PP *Ptr // PP是一个定义的多级指针类型, 它的基类型为Ptr  

使用指针

获取一个指针值:

  • 可以使用内置函数new来为任何类型的值开辟一块内存并将此内存块的起始地址做为此值的地址返回。 假设T是任一类型, 则函数调用new(T)返回一个类型为*T的指针值。 存储在返回指针值所表示的地址处的值(可被看作是一个匿名变量) 为T的零值。
  • 我们也可以使用前置取地址操作符&来获取一个可寻址的值的地址。 对于一个类型为T的可寻址的值t, 我们可以用&t来取得它的地址。 &t的类型为*T

指针使用流程:

  • 定义指针变量。
  • 为指针变量赋值。
  • 访问指针变量中指向地址的值。

在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。

package mainimport "fmt"func main() {var a int= 20   /* 声明实际变量 */var ip *int        /* 声明指针变量 */ip = &a  /* 指针变量的存储地址 */fmt.Printf("a 变量的地址是: %x\n", &a  )/* 指针变量的存储地址 */fmt.Printf("ip 变量储存的指针地址: %x\n", ip )/* 使用指针访问值 */fmt.Printf("*ip 变量的值: %d\n", *ip )
}

以上实例执行输出参考结果为(不同的电脑执行出的结果不一样,每次执行的结果也不一样):

a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20

前置解引用操作符来访问存储在一个指针所表示的地址处的值(即此指针所引用着的值) 。 比如, 对于基类型为T的指针类型的一个指针值p, 我们可以用p来表示地址p处的值。 此值的类型为T。 *p称为指针p的解引用。 解引用是取地址的逆过程。

package mainimport "fmt"func main() {p0 := new(int) // p0指向一个int类型的零值fmt.Println(p0) // (打印出一个十六进制形式的地址)fmt.Println(*p0) // 0x := *p0 // x是p0所引用的值的一个复制。p1, p2 := &x, &x // p1和p2中都存储着x的地址。// x、 *p1和*p2表示着同一个int值。fmt.Println(p1 == p2) // truefmt.Println(p0 == p1) // falsep3 := &*p0 // <=> p3 := &(*p0)// <=> p3 := p0// p3和p0中存储的地址是一样的。fmt.Println(p0 == p3) // true*p0, *p1 = 123, 789fmt.Println(*p2, x, *p3) // 789 789 123fmt.Printf("%T, %T \n", *p0, x) // int, intfmt.Printf("%T, %T \n", p0, p1) // *int, *int}

上面的结果可以由这张图进行说明:

在这里插入图片描述

内存地址

一个内存地址表示操作系统管理的整个内存中的一个偏移量(相对于从整个内存的起始, 以字节计数)。

通常地, 一个内存地址用一个操作系统原生字(native word) 来存储。 一个原生字在32位操作系统上占4个字节, 在64位操作系统上占8个字节。 所以, 32位操作系统上的理论最大支持内存容量为4GB(1GB == 230字节) , 64位操作系统上的理论最大支持内存容量为264Byte, 即16EB(EB: 艾字节,1EB == 1024PB, 1PB == 1024TB, 1TB == 1024GB)。内存地址的字面形式常用整数的十六进制字面量来表示, 比如0x1234CDEF。

为了方便,简称内存地址为地址。

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

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

相关文章

架构基本概念和架构本质

什么是架构和架构本质 在软件行业&#xff0c;对于什么是架构&#xff0c;都有很多的争论&#xff0c;每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前&#xff0c;我们先讨论架构的概念定义&#xff0c;概念是人认识这个世界的基础…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态&#xff08;polymorphism&#xff09; 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字&#xff08;C11&#xff09; 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…

Mysql_5.7下载及安装(CentOS7)

文章目录 安装MySQL的几种方式一、 使用docker安装MySQL1.1 卸载旧版本&#xff08;如果存在docker&#xff0c;需先卸载旧版本&#xff09;1.2 安装Docker使用存储库安装(推荐使用) 1.3 安装mysql5.7.35(普通用户下)*** 安装MySQL:5.7.35镜像*** 进入容器中查看配置文件以及数…

结构化GPT用例,在CSDN私密社区中死磕@ada 探索SpringBoot

在CSDN私密社区中死磕ada 探索SpringBoot Q: Spring的核心概念是哪些&#xff1f;Q: Spring MVC的核心概念是哪些&#xff1f;Q: SpringBoot的核心概念有哪些&#xff1f;Q: 介绍下SpringBoot AutoConfiguration的机制。Q: SpringBootConfiguration 和 Configuration 的区别是&…

云原生——Kubenetes基础

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 目录 一.什么是Kubernetes&#xff1f; 二.为什么你需要 Kubern…

6应用层-6.3【实验】【计算机网络】

6应用层-6.3【实验】【计算机网络】 前言推荐实验6应用层知识DHCP协议分析DHCP报文格式DHCP抓包分析 6.1 Web服务与FTP服务配置6.2 DNS域名系统配置6.3 DHCP动态协议参数配置实验目的实验内容及实验环境实验原理实验过程1.搭建网络环境2.配置路由器3.配置DSCP服务器4.完成右侧网…

frp内网穿透

frp内网穿透 一.frp的作用和原理图 1.首先frp分客户端和服务端&#xff0c;frp客户端和服务端在同一个局域网。 2.frp服务端拥有公网ip与互联网连通。 frp的作用&#xff1a; 通过一台公司拥有外网ip的服务器做为frp服务端&#xff0c;通过请求转发的形式&#xff0c;转发到公…

STM32外设系列—L298N

文章目录 一、L298N简介二、L298N电路图三、L298N使用方法四、L298N驱动电机实例4.1 麦克纳姆轮简介4.2 定时器PWM配置4.3 智能车行驶控制 五、拓展应用 一、L298N简介 L298N是SGS公司生产的一款通用的电机驱动模块。其内部包含4路逻辑驱动电路&#xff0c;有两个H桥的高电压大…

【spring】spring是什么?详解它的特点与模块

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、spring介绍 二、spring的特点&#xff08;七点&#xff09; 1、简化开发 2、AOP的支持 3、声明式事务的支持 4、方便测试 5、…

C++静态和动态链接库导出和使用

1、简介 代码开发过程中会遇到很多已有的函数库&#xff0c;这些函数库是现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是一种…

机器学习笔记 - Facebook AI Similarity Search(Faiss)简介

一、概述 Facebook AI Similarity Search (Faiss)是高效相似性搜索最受欢迎的轮子之一。给定一组向量,我们可以使用 Faiss 对它们进行索引——然后使用另一个向量(查询向量),我们在索引中搜索最相似的向量。 它包含搜索任何大小的向量集的算法,除非超出RAM的大小。它还包…

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…