Go语言学习

1、运行和解析
go run 命令已包含了编译和运行。它会先在一个临时目录编译程序,然后执行完后清理掉.
如果在run的后面加上 --work参数来查看临时目录。

go run --work  main.go

在这里插入图片描述
也可以通过go build命令来编译代码,执行后会生成一个可以执行文件,通过./XX直接执行
在这里插入图片描述
交叉编译

# 要去linux下执行 
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
# 要去Mac下执行 
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# 要去win下执行
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

CGO_ENABLED : CGO 表示golang中的工具,CGO_ENABLED 表示CGO禁用,交叉编译中不能使用CGO的

GOOS
目标平台
mac 对应 darwin
linux 对应 linux
windows 对应 windows

GOARCH
目标平台的体系架构【386,amd64,arm】, 目前市面上的个人电脑一般都是amd64架构的
386 也称 x86 对应 32位操作系统
amd64 也称 x64 对应 64位操作系统
arm 这种架构一般用于嵌入式开发。 比如 Android , IOS , Win mobile , TIZEN 等

变量类型:整型、浮点型、布尔型
变量声明:
标准声明 var 变量名称 变量类型 不需要分号
批量声明 var (变量名称 变量类型
变量名称 变量类型
变量名称 变量类型
… …)
变量初始化 var 变量名 类型 = 表达式 ,其中整型和浮点型变量默认值为0,布尔型变量默认为false,
初始化多个变量 var 变量名,变量名… = 表达式,表达式…
类型推导 var 变量名 = 表达式 ,编译器会根据表达式的值来推导变量名的类型并完成初始化
短变量声明 变量名 := 表达式
匿名变量 _一个下划线来表示
注意事项:
函数外的每个语句都必须以关键字开始(var、const、func等)
:=不能使用在函数外。
_多用于占位,表示忽略值。
常量 const
iota 常量计数器,在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次
定义数量级 << 左移操作
多个iota定义在一行
基本类型
bool (布尔)
数值类型 分为有符号数和无符号数,有符号数可以用来表示负数,不同的位数代表它们实际存储占用空间,以及取值的范围
int8、int16、int32、int64、int
uint8、uint16、uint32、uint64、uint
float32, float64
complex64, complex128
byte
rune
string
类型转换,对显式类型非常严格,没有自动类型提升或转换

循环条件
For 循环语句用于重复执行一段代码,是 Go 中唯一可用的循环
for initialisation; condition; post {
}
break语句用于在 for 循环完成正常执行之前突然终止 for 循环,并将控件移动到 for 循环之后的代码行。
continue语句用于跳过 for 循环的当前迭代。在 continue 语句之后出现在 for 循环中的所有代码都不会在当前迭代中执行。循环将继续进行下一次迭代。

if else 是一个具有布尔条件的语句,如果该条件的计算结果为真 ,它将执行一段代码true。如果条件评估为 ,它会执行一个备用的 else 块false。

swich 是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较并执行相应的代码块,switch 只要匹配中了就会中止剩余的匹配项,switch 的 case 条件可以是多个值, 同一个 case 中的多值不能重复。

数组 具有相同 唯一类型 的一组以编号且长度固定的数据项序列,数据的长度是固定的。我们在声明一个数组时需要指定它的长度,一旦指定了长度,那么它的长度值是不可以改变的。
数组声明,一个数组的表示形式为 T[n]。n 表示数组中元素的数量,T 代表每个元素的类型,可以忽略声明数组的长度,并用 … 代替,让编译器为你自动计算长度。
数组是值类型,而不是引用类型,当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本,如果对新变量进行更改,则不会影响原始数组。

	o := [...]float64{67.4, 89.3, 21, 77}for i := 0; i < len(o); i++ {fmt.Println("%d th element of a is %.2f\n", i, o[i])}
使用 range 遍历数组 ,for 循环可用于遍历数组中的元素,range 返回索引和该索引处的值
for i, v := range a 利用的是 for 循环 range 方式
多维数组  [][] 数据类型 {}
j := [2][3]string{{"li", "wang", "oi"},{"cao", "sun", "hg"},}for _, v1 := range j {for _, v2 := range v1 {fmt.Println("%s", v2)}}

切片是对数组一个连续片段的引用,是一个引用类型,是一个长度可变的数组,具有 T 类型元素的切片表示为[]T
使用语法 a[start:end] 创建一个从 a 数组索引 start 开始到 end - 1 结束的切片

a := [5]int{76, 77, 78, 79, 80}var b []int = a[1:4]fmt.Println(a)fmt.Println(b)

切片的修改:切片自己不拥有任何数据。它只是底层数组的一种表示。对切片所做的任何修改都会反映在底层数组中。

a := [5]int{76, 77, 78, 79, 80}var b []int = a[1:4]fmt.Println(a)fmt.Println(b)for g := range b {b[g]++}fmt.Println(a)

切片的长度和容量:
切片的长度是切片中的元素数。切片的容量是从创建切片索引开始的底层数组中元素数。

funarry := [...]string{"1", "2", "3", "4", "5"}funlist := funarry[1:4]fmt.Println(len(funlist), cap(funlist))

切片可以重置其容量。任何超出这一点将导致程序运行时抛出错误。

	funarry := [...]string{"1", "2", "3", "4", "5"}funlist := funarry[1:4]fmt.Println(len(funlist), cap(funlist))funlist = funlist[:cap(funlist)]fmt.Println(len(funlist), cap(funlist))

func make([]T,len,cap)[]T 通过传递类型,长度和容量来创建切片。容量是可选参数, 默认值为切片长度。make 函数创建一个数组,并返回引用该数组的切片。

r := make([]int, 5, 6)fmt.Println(r)

追加切片元素,使用 append 可以将新元素追加到切片上。append 函数的定义是 func append(s[]T,x … T)[]T。x … T 在函数定义中表示该函数接受参数 x 的个数是可变的。这些类型的函数被称为可变参函数。

car := []string{"福田", "宝马", "奔驰"}fmt.Println(car,len(car),cap(car))car = append(car, "雷克萨斯")fmt.Println(car,len(car),cap(car))

切片函数传递,切片包含长度、容量和指向数组第零元素的指针,切片原有空间不够时自动新建底层数组, 小于 1024, 新的容量直接翻倍增加

func subtactone(number []int) {for i := range number {number[i] -= 2}
}nos := []int{8, 7, 6}fmt.Println(nos)subtactone(nos)fmt.Println(nos)

多维切片,与数组类似,可以有多个维度

pos := [][]string{{"c++", "java"},{"python", "goland"},}for _, v1 := range pos {for _, v2 := range v1 {fmt.Println(v2)}}

map 一种无序的键值对, 它是数据结构 hash 表的一种实现方式
map[type of key]type of value{xxxxxxxx}
make(map[type of key]type of value)

look := map[string]int{"code": 1, "msg": 333}fmt.Println(look)cm := make(map[string]int)cm["name"] = 22fmt.Println(cm)

map的零值是nil

var say map[string]intsay["code"] = 10000
panic: assignment to entry in nil map

检索建的值 map[key]

citys := map[string]int{"北京": 110000,"广东": 430000,}city := "北京"postCode := citys[city]fmt.Println(city, postCode)

该映射将返回该元素类型的零值, 0 当我们尝试检索 Map中不存在的键的值时,不会出现运行时错误

citys := map[string]int{"北京": 110000,"广东": 430000,}city := "北京1"postCode := citys[city]fmt.Println(city, postCode)

检查键值是否存在 value, ok := map[key]

citys := map[string]int{"北京": 110000,"广东": 430000,}city := "北京"value, ok := citys[city]if ok == true {fmt.Println(value)postCode := citys[city]fmt.Println(city, postCode)}

遍历map中的所有元素 for循环的range形式用于迭代 Map的所有元素。

citys := map[string]int{"北京": 110000,"广东": 430000,}for key, value := range citys {fmt.Println(key, value)}

从map中删除元素 delete(map,key),函数没有返回值,删除 Map中不存在的键,则不会出现运行时错误。

citys := map[string]int{"北京": 110000,"广东": 430000,}delete(citys, "北京")for key, value := range citys {fmt.Println(key, value)}

与切片一样,maps 是引用类型。当一个 map 赋值给一个新的变量,它们都指向同一个内部数据结构。因此改变其中一个也会反映到另一个。
须指定 key, value 的类型,插入的纪录类型必须匹配。
key 具有唯一性,插入纪录的 key 不能重复。
KeyType 可以为基础数据类型(例如 bool, 数字类型,字符串), 不能为数组,切片,map,它的取值必须是能够使用 == 进行比较。
ValueType 可以为任意类型。
无序性。
线程不安全, 一个 goroutine 在对 map 进行写的时候,另外的 goroutine 不能进行读和写操作,Go 1.6 版本以后会抛出 runtime 错误信息。

字符串string,通过将一组字符括在双引号中来创建字符串" "

%s 是打印字符串的格式说明符
%x 是十六进制的格式说明符
%b 是二进制的格式说明符
%d 是十进制的格式说明符
%o 是八进制的格式说明符
%t true或false
%c 格式说明符用于在printChars方法中打印字符串的字符
%T是用来输出数据类型的格式化占位符
%v输出所有的值信息

web := "https:www.gotribe.cn"fmt.Println(web)

字符串的单个字节

web := "https:www.gotribe.cn"fmt.Println(web)for i := 0; i < len(web); i++ {fmt.Println(web[i])}

在 UTF-8 编码中,一个码点可能会占一个以上的字节
rune 是Go 中的内置类型,它是 int32 的别名。Rune 表示 Go 中的 Unicode 代码点。代码点占用多少字节并不重要,它可以用一个符文来表示

web := "Señor"runes := []rune(web)for i := 0; i < len(runes); i++ {fmt.Printf("%c ", runes[i])}

字符串连接
使用+运算符

string1 := "1"string2 := "2"result := string1 + string2fmt.Println(result)
使用 fmt 包的Sprintf函数
string1 := "1"string2 := "2"string3 := "3"result := fmt.Sprintf("%x %x %s", string1, string2, string3)fmt.Println(result)

函数 是执行特定任务的代码块

func name(parameter) (result-list){//body
}

函数声明以func关键字开头,后跟name(函数名). 在括号中指定参数,后面为函数返回值result-list
指定参数的语法是,参数名称后跟类型。可以指定任意数量的参数,例如(parameter1 type, parameter2 type)。而{,}内的代码为函数的主体内容。
函数组成
函数名
参数列表(parameter)
返回值(result-list)
函数体(body)
参数和返回类型在函数中是可选的

单返回值函数

func plus(a, b int) (res int) {return a + b
}count := plus(1, 3)fmt.Println(count)

多返回值函数,一个函数可以返回多个值

func multi() (string, int) {return "网", 2
}
name, age = multi()fmt.Println(name, age)

命名返回值,从函数返回命名值。如果返回值被命名,则可以认为它在函数的第一行被声明为变量。

func nameValue() (name string, height int) {// name = "王"// height = 110return
}name, height := nameValue()fmt.Println(name, height)

参数可变函数

func sum(nums ...int) int {res := 0for _, v := range nums {res += v}return res
}
fmt.Println(sum(1))fmt.Println(sum(1, 2))fmt.Println(sum(1, 2, 3))

匿名函数

func(name string) {fmt.Println(name)}("web")

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

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

相关文章

HIVE笔记

表关联 内连接&#xff08;INNER JOIN&#xff09; 返回两个表中满足关联条件的记录。 SELECT * FROM t1 INNER JOIN t2 ON t1.col1 t2.col2;左连接&#xff08;LEFT JOIN&#xff09; 返回左表中的所有记录&#xff0c;以及右表中满足关联条件的记录。 SELECT * FRO…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

如何用matlab制作游戏?

在MATLAB中制作游戏可以采用图形用户界面&#xff08;GUI&#xff09;或使用MATLAB的绘图和交互功能。以下是一些制作游戏的基本步骤&#xff1a; 使用 MATLAB GUI 制作游戏 打开 GUIDE&#xff08;GUI 开发环境&#xff09; 打开 MATLAB 并在命令行中输入 guide 打开 GUIDE。…

使用Rollup 搭建开发环境

1 什么是Rollup Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。(开…

算法设计与分析 | 矩阵连乘

题目描述 一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵&#xff0c;运算量为nmp。 矩阵乘法满足结合律&#xff0c;A*B*C可以表示成(A*B)*C或者是A*(B*C)&#xff0c;两者的运算…

linux安装maven3.8.8官网下载安装

步骤 1&#xff1a;下载 Maven 安装包 打开浏览器&#xff0c;访问 Maven 官方网站&#xff1a;https://maven.apache.org/download.cgi在页面上找到最新的稳定版本的 Maven&#xff0c;复制下载链接。 步骤 2&#xff1a;使用终端下载 Maven 安装包 打开终端&#xff0c;使…

什么是https证书?

HTTPS证书&#xff0c;也称为SSL&#xff08;Secure Sockets Layer&#xff09;证书或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;是一种数字证书&#xff0c;用于在网络上建立安全的加密连接。它的主要目的是确保在互联网上进行的数据传输的安全性和…

Linux空间不足处理

目录 临时处理 杀死没在使用的后台进程&#xff08;某些进程可能会占用几十个G的空间&#xff09; 手动释放空间 清理/tmp/ray目录 永久处理 将文件挪至空间充足的挂载盘 将软件挪至空间充足的挂载盘&#xff0c;在原目录创建软链接 临时处理 杀死没在使用的后台进程&a…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

Android 12 Token 机制

一、前言 在 android framework 框架中 activity 和 window 是相互关联的&#xff0c;而他们的管理者 AMS 和 WMS 是怎么来实现这种关联关系的&#xff0c;答案就是通过 token。 首先大家需要了解一下 LayoutParams&#xff0c;当然属性很多&#xff0c;简单了解即可&#xf…

深入理解ArkTS:Harmony OS 应用开发语言 TypeScript 的基础语法和关键特性

文章目录 前言TypeScript语法变量声明条件控制循环迭代函数类和接口模块开发文章总结要点总结前言 Harmony OS应用开发的主力语言ArkTS的前身TS语言的基本语法。通过学习变量的声明和数据类型、条件控制、函数声明、循环迭代等基本知识,并了解内核接口的声明和使用。同时还介…

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…

redis开启密码验证

开启密码验证 &#xff08;1&#xff09;配置文件中设置 redis.conf文件里面配置requirepass参数&#xff0c;redis认证密码&#xff1a;foobared&#xff0c;然后重启redis服务 ./redis-cli 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> CONFIG SET requi…

训练和测试的loss、accuracy等数据保存到文件并读出

首先是写文件到excel import os.path from openpyxl import load_workbook import pandas as pd import matplotlib.pyplot as pltdef write_excel(excel_name, sheet_name, value):columns ["epoc", "train_loss", "train_acc", "test_a…

跟着野火学FreeRTOS:第一段(任务延时列表)

既然是延时列表&#xff0c;那肯定要先定义相应的链表&#xff0c;延时列表的定义如下。这里定义了两条延时列表&#xff08;其实就是前面小节里面提到的链表的根节点&#xff09;&#xff0c;一条是准备当记录 S y s t i c k Systick Systick周期个数的变量 x T i c k C o u n…

idea Spring Boot项目使用JPA创建与数据库链接

1.pom.xml文件中添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>…

创建和配置Spring MVC框架构建Web应用

1 认识Spring MVC Spring Web MVC是构建在Servlet API之上的Web框架&#xff0c;自诞生之时就被纳入了Spring框架中。其正式/官方名称为“Spring Web MVC”&#xff0c;源自其所属的模块&#xff08;spring-webmvc&#xff09;&#xff0c;但通常被称为“Spring MVC”。 1.1…

最短路径(数据结构实训)(难度系数100)

最短路径 描述&#xff1a; 已知一个城市的交通路线&#xff0c;经常要求从某一点出发到各地方的最短路径。例如有如下交通图&#xff1a; 则从A出发到各点的最短路径分别为&#xff1a; B&#xff1a;0 C&#xff1a;10 D&#xff1a;50 E&#xff1a;30 F&#xff1a;60 输…

“暂存”校验逻辑探讨

1、背景 在业务中可能会遇到这种场景&#xff0c;前端页面元素多且复杂&#xff0c;一次性填完提交耗时很长&#xff0c;中间中断面临着丢失数据的风险。针对这个问题&#xff0c;“暂存”应运而生。 那“暂存”的时候&#xff0c;是否需要对数据校验&#xff0c;如何进行校验…

【全局光照GI系统剖析_Enlighten和Progressive Lightmapper_案例分享(附带场景下载链接)_场景】

烘焙预计算 前文:续_直接和间接光照这一篇小结:Unity烘焙预计算烘焙前的场景设置1.2.Contribute GI如下图:物体的Static和面板上的Contribute GILightmap的UV模型自带Lightmap的UVUnity 自动展Lightmap的UV1.3.Meta PassMeta Pass代码如下:1.4.Light Mode模式