Go语言学习(一):变量常量、基本类型、数组

GO 基础语法(1)——常量变量函数数组 一、变量声明赋值 package main import ( "fmt" "unsafe" ) //全局变量声明 var ( globelString string globleInt int ) func main() { //局部变量声明 way1 var string string string = "hi go" fmt.Println(string) /... 阅读详情

目录

1、init函数和main函数

2、变量和常量

3、基本类型:

4、数组

1、init函数和main函数

相同点:

两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
init可以应用于任意包中,且可以重复定义多个。
main函数只能用于main包中,且只能定义一个。

两个函数的执行顺序:
调用顺序:
对同一个go文件的init()调用顺序是从上到下的。
对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。
对于不同的package,如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init(),如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。import _ 包路径  只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数
import _ "./hello"

2、变量和常量

var 变量名 变量类型

批量声明用()

var (

    a string

    b int

)

类型推导:var name string = "pprof.cn"

短变量声明:n := 10

_ 匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。 (在Lua等编程语言里,匿名变量也被叫做哑元变量。)

常量:var 换成 const

iota:是go语言的常量计数器,只能在常量的表达式中使用。 iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。

package main

import "fmt"


func iota_use1() {
	//会顺延a,b的规则递增
	const (
		a, b = iota + 1, iota + 2 //1,2
		c, d                      //2,3  iota=1,c=1+1,d=1+2
		e, f                      //3,4
	)
	fmt.Printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d)
}
func iota_use2() {
	//e会顺延d的规则递增
	const (
		a = iota //0
		b        //1
		_
		d = iota + 1 //3+1
		e            //4+1
	)
	fmt.Printf("a=%d,b=%d,d=%d,e=%d\n", a, b, d, e)
}
func iota_use3() {
	//每当某个枚举被重置(即后面使用iota重新赋值时),则需要从第一个枚举数到当前的次序
	const (
		a = iota //0
		b        //1
		_
		d = iota + 1 //3+1=4
		e            //4+1=5
		f = iota + 2 //5+2=7
		g = iota     //6
	)
	fmt.Printf("a=%d,b=%d,d=%d,e=%d,f=%d,g=%d\n", a, b, d, e, f, g)
}

func main() {
	iota_use1()
	iota_use2()
	iota_use3()
}

3、基本类型:

byte和rune类型

uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。

rune类型,代表一个 UTF-8字符。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

修改字符串:

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

 强制类型转换:T(表达式)

4、数组

1. 数组:是同一种数据类型的固定长度的序列。

2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。

3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。

4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1

for i := 0; i < len(a); i++ {}

for index, v := range a {}

5. 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic

6. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。

7.支持 "=="、"!=" 操作符,因为内存总是被初始化过的。

8.指针数组 [n]*T,数组指针 *[n]T。

内置函数 len 和 cap 都返回数组长度 (元素数量)。

package main

import (
	"fmt"
	"math/rand"
	"time"
)

// byte和rune类型

// 遍历字符串
func traversalString() {
	s := "pprof.cn博客"
	for i := 0; i < len(s); i++ { //byte
		fmt.Printf("%v(%c) ", s[i], s[i])
	}
	fmt.Println()
	for _, r := range s { //rune
		fmt.Printf("%v(%c) ", r, r)
	}
	fmt.Println()
}

// 修改字符串
// 要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
// 强制类型转换:T(表达式)
func changeString() {
	s1 := "hello"
	// 强制类型转换
	byteS1 := []byte(s1)
	byteS1[0] = 'H'
	fmt.Println(string(byteS1))

	s2 := "博客"
	runeS2 := []rune(s2)
	runeS2[0] = '狗'
	fmt.Println(string(runeS2))
}

// 112(p) 112(p) 114(r) 111(o) 102(f) 46(.) 99(c) 110(n) 229(å) 141() 154() 229(å) 174(®) 162(¢)
// 112(p) 112(p) 114(r) 111(o) 102(f) 46(.) 99(c) 110(n) 21338(博) 23458(客)
// Hello
// 狗客

// 数组

func array_use() {
	a := [3]int{1, 2}           // 未初始化元素值为 0。
	b := [...]int{1, 2, 3, 4}   // 通过初始化值确定数组长度。
	c := [5]int{2: 100, 4: 200} // 使用引号初始化元素。
	d := [...]struct {
		name string
		age  uint8
	}{
		{"user1", 10}, // 可省略元素类型。
		{"user2", 20}, // 别忘了最后一行的逗号。
	}
	fmt.Println(a, b, c, d)
	//多维
	e := [2][3]int{{1, 2, 3}, {4, 5, 6}}
	f := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 纬度不能用 "..."。
	fmt.Println(e, f)
}

//值拷贝行为会造成性能问题,通常会建议使用 slice,或数组指针。
//什么拷贝内存地址都变了???

func test(x [2]int) {
	fmt.Printf("值拷贝 x: %p\n", &x)
	x[1] = 1000
}
func test2(x *[2]int) {
	fmt.Printf("引用拷贝 x: %p\n", &x)
	x[1] = 1000
}
func slice_copy(x []int) {
	x[1] = 1000
	fmt.Printf("slice拷贝 x: %p\n", &x)
}
func array_copy() {

	a := [2]int{}
	fmt.Printf("a: %p\n", &a)

	test(a)
	fmt.Println(a)
	test2(&a)
	fmt.Println(a)

	b := []int{0, 0}
	fmt.Printf("b: %p\n", &b)
	slice_copy(b)
	fmt.Println(b)

}

// 多维数组遍历
func arrays() {

	var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}

	for k1, v1 := range f {
		for k2, v2 := range v1 {
			fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
		}
		fmt.Println()
	}
}

// 练习1:求数组所有元素之和
func sumArr(a [10]int) int {

	sum := 0
	for i := 0; i < len(a); i++ {
		sum += a[i]
	}
	return sum
}

// 练习1:求数组所有元素之和
func learn1() {
	rand.Seed(time.Now().Unix())
	var a [10]int
	for i := 0; i < len(a); i++ {
		// seed()种子默认是1
		//产生一个0-100的随机数,包括100吗?
		a[i] = rand.Intn(100)
	}
	sum := sumArr(a)
	fmt.Println("sum=", sum)
}

// 练习2:
// 找出数组中和为给定值的两个元素的下标,例如数组[1,3,5,8,7],
// 找出两个元素之和等于8的下标分别是(0,4)和(1,2)
func findSum(a []int, x int) {
	for i := 0; i < len(a); i++ {
		for j := i + 1; j < len(a); j++ {
			if a[i]+a[j] == x {
				fmt.Printf("(%d,%d)\n", i, j)
			}
		}
	}
}
func learn2() {
	a := []int{1, 3, 5, 8, 7}
	findSum(a, 8)
}
func main() {
	// traversalString()
	// changeString()
	// array_use()
	//array_copy()
	//arrays()
	learn2()
}

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版) 本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。 阅读详情

相关推荐

2025.06.24【R语言】|clusterProfiler安装与常见报错FAQ全解

本文介绍了clusterProfiler工具的安装方法及常见报错解决方案。安装可通过Bioconductor或Conda完成,需注意安装配套注释包。文中列举了10种常见报错,包括依赖包缺失、ID类型不匹配、物种不支持等问题,并给出具体解决方法。最后总结了GO/KEGG富集分析的标准流程,包括ID转换、富集分析和可视化步骤,为生物信息学分析提供实用参考。建议使用R≥4.2版本,并确保正确调用BiocManager进行安装。

5994

golang-常量

常量 使用constant关键字进行定义 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型 常量的定义格式: const identifier [type] = value 当然,也可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。 显式类型定义:const Astring = "abc" 隐式类型定义:const A= "a...

cbwcole的博客 1074

单窗算法的地表温度反演:谷歌地球引擎GEE代码

该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。

2301_78834737的博客 553

Golang 基本数据类型,常量,数组,切片,字符串

整数 int8、int16、int32、int64 uint8、uint16、uint32、uint64 int、uint (不同的编译器即使在相同的硬件平台上可能产生不同的大小) uintptr 无符号的整数类型。指针大小 优先级递减 * / % << >> & &^ + - ...

我是要成为海贼王的男人! 3298

PCB板质量测试和PCB板

PCB板质量测试和板厂

weixin_51370842的博客 515

Unity 代码混淆<混淆插件(Obfuscator Pro 3.9.4)>

Unity 代码混淆<混淆插件(Obfuscator Pro 3.9.4)> 插件导入项目 导入后打开OPS/Obfuscator/Obfuscator Pro Settings 打开后可以看到界面如下 可以在上面界面中选择你需要混淆的类,方法,字段,属性,事件,参数。需要混淆的程序集的选择。如果有些程序集混淆后会有问题也可以添加到白名单里不被混淆 根据自己需求取选择 这个界面是是否添加添加随机代码的 如果使用了上面的插件可以使用 插件下载网址:https://download.cs

Xing_Cheng_Yun的博客 5099

Go语言基础之数组

文章目录Go语言基础之数组Array(数组)数组定义:数组的初始化方法一方法二方法三数组的遍历多维数组二维数组的定义二维数组的遍历数组是值类型练习题 Go语言基础之数组 本文主要介绍Go语言中数组(array)及它的基本使用。 Array(数组) 数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法: // 定义一个长度为3元...

Allen 1万+

1.1.4 运用防火墙实现入侵防御

摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)

Ljs040411的博客 2130

golang 常量

文章目录1.类型2.声明3.特点4.iota常量生成器1.声明2.用途3.枚举类型5.无类型常量1.声明2.未明确类型的常量模型6.访问范围跳转 1.类型 注意,只有下面这几种类型 1.数值类型: 整数型、浮点型、复数 2.布尔类型 3.字符串类型 2.声明 常量在定义的时候,就必须要初始化 常量设置以后不能修改 定义格式: const name [type] = value 显示类型 const b string = "abc" 隐式类型 const b

shulei00的博客 526

PCL 点到面的ICP算法【2024最新版】

经典的点到面的ICP算法。博客长期更新,本文最新更新时间为:2024年10月18日。

点云侠的博客 36万+

G.6 PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】

百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]_汀、的博客-优快云博客PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】_汀、的博客-优快云博客 PaddleHub--{超参优化AutoDL Finetuner}【二】_汀、的博客-优快云博客PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】_汀、的博客-优快云博客通过前面几篇文章大家都有一定了解,下面

丨汀、的博客 6185

Golang的变量常量及基本类型

1,变量变量的声明: Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明, Go语言引入了 关键字var,而类型信息放在变量名之后,示例如下:1.1变量的声明var v1 int var v2 string var v3 [10]int // 数组 var v4 []int // 数组切片 var v5 struct { f int } var v6 *int // 指针 v

欧阳冉冉的部落格 1万+

Far planner 代码系列(14)

MatchContourWithNavGraph(3) this->EnclosePolygonsCheck(); //可能有些ctnode的is_contour_necessary属性变成了true // 这说明我的contour_graph是一个local层级的 才会从这里面 get new vertices new_convex_vertices.clear(); //! 把contour_graph_里符

博客 899

Go语言之路————go基本语法、数据类型、变量、常量、输出

我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正常完成工作上的业务开发的过程,如果你也是个小白或者转Go语言的,希望我这篇文章对你有所帮助。有关go其他基础的内容的文章大家可以查看我的主页,接下来主要就是把这个系列更完,更完之后我会在每篇文章中挂上连接,方便大家跳转和复习。

StreamlineWq的博客 1217

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Go基础编程 - 04 - 基本类型、常量和变量

基本类型、常量和变量,类型断言,强制转换,隐式转换。

1242

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Go学习笔记】1:变量,常量,数组

变量基本使用 package main import "fmt" var e = "一个全局变量字符串" var f, g int = 1, 2 //一次定义多个 //可以用因式分解的写法 var ( h, i, j int = 3, 4, 5 k bool = false l, m float32 = 2.5, 3.5 ) func main() {...

大桔骑士的学习笔记 2595

golang语法学习(一):变量,常量以及数据类型

学习一门新的语言肯定是要从他的基本语法开始,语法构成了整个程序设计的基础,从语法中我们也可以看到这门语言的一些特性,但是话说回来,语法这东西,不同的语言大同小异,所以这也对语法的记忆造成了一定的难度,其实最好的方法应该是旁边有本书,随时可以拿过来查阅或者纠正。当然golang的语法也是这样,下面的一些是我学习七牛团队许式伟等出的《Go语言编程》: http://baike.baidu.com/li

挑灯看剑的专栏 7265

第 4 章 - Go 语言变量与常量

常量在Go语言中使用const关键字声明。常量的值在编译时确定,不能在运行时修改。通过上述示例,我们详细讲解了Go语言中的变量声明、常量定义和类型推断。这些基本概念是编写Go程序的基础,希望这些内容能帮助你更好地理解和使用Go语言。当然,我们可以继续深入探讨更多关于变量和常量的高级用法,包括变量的作用域、多变量声明、常量的枚举和 iota 的使用等。下面是一些更详细的示例和解释。通过上述示例,我们详细讲解了Go语言中的变量作用域、多变量声明、常量的枚举和iota的使用。

hummhumm的专栏 2156

Golang语言基础篇001_常量变量与数据类型

在任何编程语言中,常量和变量都是最基本的概念之一。它们用于存储程序运行过程中需要的数据。在Go语言中,常量和变量有着不同的特性和使用方式。 本文将介绍Golang中常量、变量的概念、声明方式、命名规范等内容。另外,还会概述Golang中的数据类型。

ChineHe的博客 1511

【四】Golang 变量和常量

本文全面介绍了 Golang 语言中用于存储数据的基本单元。变量用于存储可变的数据,而常量则用于存储不可变的值。

业精于勤而荒于嬉,行成于思而毁于随 1289

【Go语言学习系列03】Go基础语法(一):变量与数据类型

全面讲解Go语言流程控制结构,包括if、switch、for循环的特殊用法,以及break、continue和goto的最佳实践

GopherTribe的博客 901

go语言学习 第 2 章:变量与数据类型

本章详细介绍了Go语言中的变量与数据类型。内容包括变量的声明与初始化方法(使用var和:=语法),以及Go语言丰富的数据类型体系:整数、浮点、字符、布尔和字符串等基本类型,数组、切片和映射等复合类型。同时解释了类型转换、变量作用域(局部与全局)以及常量的使用。掌握这些基础知识是编写高效、可维护Go程序的关键。

2301_80152021的博客 1202

Go 语言编程 — 变量与常量

目录 文章目录目录变量(var)指定数据类型的变量声明根据初始化数值自动判定数据类型的变量定义 变量(var) Golang 使用关键字 var 来声明一个变量。格式如下: var identifier type 也可以一次声明多个变量: var identifier1, identifier2 type 指定数据类型的变量声明 与 C 语言一般,可以在一条语句中完成变量的声明、定义以及初始化。如果没有初始化,则变量默认为零值。 示例: package main import "fmt" func

烟云的计算 2143

一、Go语言的变量和常量

1.变量 变量是几乎所有编程语言中最基本的组成元素。从根本上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。 1.1 变量声明 对于纯粹的变量声明,Go语言引入关键字var,而类型信息放在变量名之后,形如: var variableName type var vname1, vname2, vname3 t

瘦纸好过夏的专栏 1583

变量和常量(Go语言)

变量 概念 变量是计算机语言中存储数据的抽象概念。变量的功能是存储数据。变量通过变量名访问。 变量的本质是计算机分配的一小块内存,专门用于存放指定数据,在程序运行过程中该数值可以发生改变。 变量的存储往往具有瞬时性,或者说是临时存储,当程序运行结束,存放该数据的内存就会释放,而该变量就会消失。 Go语言的变量名有字母,数字,下划线组成,首个字符不能为数字。 Go语法规定,定义的局部变量若没有被调用则编译错误。 命名:驼峰标识,不建议用下划线连接多个单词。 声明变量 变量声明有多种形式 //未初始化的标准格式

朱夏彤的博客 4833

Go基础:下划线“_”、变量和常量、数组、slice

目录 前言: Go语言的设计初衷 Go语言很特别 Go语言的主要特征 GO概览 Go基础 Go语言声明 下划线(很特殊) 变量声明 常量声明 数组 切片Slice 前言: Go语言的设计初衷 针对其他语言的痛点进行设计 并加入并发编程 为大数据、微服务、并发而生的通用编程语言 Go语言很特别 没有“对象”,没有继承多态、类等,没有泛型,没有try/cat...

琦彦 1万+

GO-变量&常量&类型

GO的变量 go时静态语言,所以不支持在运行时改变变量的类型。 go变量的类型是由关键字var来表示的。 var i int = 1 //定义int型变量i 在定义go的变量时,可以不显示制定变量的类型,而有编译器来推断。 var i : = 1 //定义变量i,类型由编译器推断 go支持同时定义多个变量,同时对多个变量进行赋值。 //同时定义三个变量int型变量 x,y,z var x,y,...

zhengfeng1357的博客 581
上一篇: CNN+VGG+ResNet
下一篇: Go学习(二):切片Slice、指针
Lay_XZ
博客等级 码龄5年 29粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值