【七天入门Go语言】程序结构 && 数据类型 | 第二天

简介: 目录1. 程序结构1.1 名称1.2 声明1.3 注释1.4 单双引号1.5 输出2. 数据类型2.1 整型2.2 浮点型2.3 复数2.4 布尔型2.5 字符串2.6 常量2.7 数组2.8 切片2.9 map2.10 结构体2.11 JSON3. 流程控制3.1 条件语句3.2 选择语句3.3 循环语句最后

目录

1. 程序结构

1.1 名称

1.2 声明

1.3 注释

1.4 单双引号

1.5 输出

2. 数据类型

2.1 整型

2.2 浮点型

2.3 复数

2.4 布尔型

2.5 字符串

2.6 常量

2.7 数组

2.8 切片

2.9 map

2.10 结构体

2.11 JSON

3. 流程控制

3.1 条件语句

3.2 选择语句

3.3 循环语句

最后


image.png

image.png

1. 程序结构

1.1 名称

如果一个实体名称在函数中声明,它只在函数局部有效。如果声明在函数外,它将对包里面的所有源文件可见。


实体第一个字母的大小写决定其可见性是否跨包。如果名称是以大写字母的开头,它是导出的,意味着它对外包来说是可见的可访问的,可以被自己包外的其他程序所引用。


大写可以!

image.png

小写不行!

image.png


并且Go语言常常会使用驼峰式的风格命名

func main() {
  FanOne := "666" //大驼峰 (注意!一般函数内部都是用小驼峰,局部变量,大驼峰一般用于函数的命名,需要外包的导出)
  fanOne := "666" //小驼峰
}

当然可以使用下划线比如,不过我还是比较驼峰式~

image.png


1.2 声明

go语言可通过var进行变量的声明

var 变量名 类型


例如:


func main(){
  var fanOne string 
  var xiaoSheng int
  var a,b,c = true , 6.6 , "fanOne" //bool ,float , string
}

当然也可以使用:=


例如

func main(){
  fanOne:="666" //string字符串
  xiaoSheng := 666  //int整型
  a,b,c := true , 6.6 ,"fanOne"  //bool ,float , string
}

1.3 注释

可以用


//单行注释
/*
多行注释
*/


1.4 单双引号

func main(){
  var d rune
  d = '1'
  a := 'a'
  b := "a"
  c := `'a'':"b"`  //可以把单引号和双引号整括起来
  fmt.Printf("%T\n",d)  // int32
  fmt.Printf("%T\n",a)  // int32
  fmt.Printf("%T\n",b)  // string
  fmt.Printf("%T\n",c)    // string
}

1.5 输出

//Println 自带换行 Printf 格式化输出

image.png


image.png

2. 数据类型

2.1 整型

整型数据可以分为两类,有符号和无符号两种类型


有符号: int, int8, int16, int32, int64


无符号: uint, uint8, uint16, uint32, uint64, byte


另外rune是int32的别名


在保证程序正确运行下,尽量使用占用空间小的数据类型


不同位数的整型区别在于能保存整型数字范围的大小;

有符号类型可以存储任何整数,无符号类型只能存储自然数

int和uint的大小和系统有关,32位系统表示int32和uint32,如果是64位系统则表示int64和uint64

byte与uint8类似,一般用来存储单个字符

2.2 浮点型

有 float64 和 float32 两种


float64的精度要比float32的要准确

如果我们要保存一个精度高的数,则应该选择float64

浮点型的存储分为三部分:符号位+指数位+尾数位,在存储过程中,精度会有丢失


Go的浮点型默认为float64类型


2.3 复数

有complex64和complex128 , 二者分别由float32和float64 构成,内置的complex函数根据给定的实部和虚部创建复数,而内置的real函数和img函数则分别提取复数的实部和虚部:


var x complex128 = complex(1,2) //1+2i
var y complex128 = complex(3,4) //3+4i
fmt.Println(x*y)    //-5+10i
fmt.Println(real(x*y))  //-5
fmt.Println(imag(x*y))  //10

当然我们也可以像这样


x := 1 + 2i
y := 3 + 4i


2.4 布尔型

只有两种可能true或者式false

var fanOne true
var xiaoSheng false


2.5 字符串

func main(){
  s:="FanOne"
  fmt.Println(len(s)) //6
  fmt.Println(s[:3])  //Fan
  fmt.Println(s[1],s[2]) // 97 110
}


字符串拼接


func main(){
  s:="FanOne"
  b := "666"
  y := s + b
  fmt.Println(y) //FanOne666
}


字符串转int


num,err:=strconv.Atoi("666")//num就是整型


int 转 字符串


str := strconv.Itoa(666) //str是字符串


2.6 常量

const a = 666
fmt.Println(a) //666


2.7 数组

var a [3]int //3个整数的数组
for i , v := range a {
  fmt.Println(i,v)  
}


var fan [3]int{1,2,3}
var one [3]int{1,3}
t := [...]int{1,2,3} //省略号
fmt.Printf("%T",t)  //[3]int

go语言的数组的长度是固定的,所以在某些场景下数组存在着它的局限性

而切片的存在就解决了数组长度局限的问题,切片可以看做一个可以自动扩容的数组,但是它跟数组还是有着区别。


2.8 切片

可以通过make或切片字面量来创建和初始化切片,也可以利用现有数组或切片直接创建切片(Go语言中的引用类型(slice、map、chan)不能使用new进行初始化)。


使用make时,需要传入一个参数指定切片的长度,如果只指定长度,则切片的容量和长度相等。也可以传入两个参数分别指定长度和容量。不允许创建容量小于长度的切片。


设置标签

// make只传入一个参数指定长度,则容量和长度相等。以下输出:"len: 10, cap: 10"
s := make([]int, 10)
fmt.Printf("len: %d, cap: %d\n", len(s), cap(s))
// make 传入长度和容量。以下输出:"len: 10, cap: 15"
s := make([]int, 10, 15)
fmt.Printf("len: %d, cap: %d\n", len(s), cap(s))
// 不允许创建容量小于长度的切片。下面语句编译会报错:"len larger than cap in make([]int)"
s := make([]int, 10, 5)


通过切片字面量来声明切片。

// 通过字面量声明切片,其长度和容量都为5。以下输出:“len: 5, cap: 5”
s := []int{1, 2, 3, 4, 5}
fmt.Printf("len: %d, cap: %d\n", len(s), cap(s))
// 可以在声明切片时利用索引来给出所需的长度和容量。
// 通过指定索引为99的元素,来创建一个长度和容量为100的切片
s := []int{99: 0}


基于现有数组或切片来创建切片的方法为:s := baseStr[low:high:max],low指定开始元素下标,high指定结束元素下标,max指定切片能增长到的元素下标。这三个参数都可以省略,low省略默认从下标0开始,high省略默认为最后一个元素下标,max省略默认是底层数组或切片的容量(这里也要注意max不能小于high)。这种方式下,切片的长度和容量的计算方式为:


len = hith - low
cap = max - low
s1 := baseStr[1:3:10]
fmt.Printf("len: %d, cap: %d\n", len(s1), cap(s1)) // len: 2, cap: 9
s2 := baseStr[1:3]
fmt.Printf("len: %d, cap: %d\n", len(s2), cap(s2)) // len: 2, cap: 9
s3 := baseStr[:3]
fmt.Printf("len: %d, cap: %d\n", len(s3), cap(s3)) // len: 3, cap: 10
ss1 := s1[2:5]
ss2 := s1[3:8]
fmt.Printf("len: %d, cap: %d\n", len(ss1), cap(ss1)) // len: 3, cap: 7
fmt.Printf("len: %d, cap: %d\n", len(ss2), cap(ss2)) // len: 5, cap: 6


增加可以用append


// 创建一个整型切片
// 其长度和容量都是5个元素
slice := []int{1, 2, 3, 4, 5}
// 创建一个新切片
// 其长度为2 个元素,容量为4个元素
newSlice := slice[1:3]
// 使用原有的容量来分配一个新元素
// 将新元素赋值为 60
newSlice = append(newSlice, 6)
fmt.Printf("slice: %v\n", slice)       // slice: [1 2 3 6 5]
fmt.Printf("newSlice: %v\n", newSlice) // newSlice: [2 3 6]


2.9 map

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。


Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。


声明·

/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
var fan map[string]string //创建集合 
  fan = make(map[string]string)
  //map插入key-value对
  fan [ "One" ] = "666"
  fan [ "Four" ] = "999"
  //使用键输出
  for value := range fan {
  fmt.Println(value, "is", fan [value])
  }
  //查看元素在集合中是否存在
  val, ok := fan [ "Two" ] //如果确定是真实的,则存在,否则不存在
  if ok {
  fmt.Println("fanTwo is", val)
  } else {
  fmt.Println("fanTwo not exist")
  }


delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。

可以使用delete方法删除

delete(fan , "One")

2.10 结构体

结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:


type Person struct{
  name string
  age int
  sex string
}
func main(){
  person := Person{  //初始化
  name: "fanOne",
  age:  16,
  sex:  "male",
  }
  fmt.Println(person.name)  //引用
}


2.11 JSON

type Person struct{
  Name string `json:"name"` //序列化成string类型
  Age int `json:"age"`
  Sex string `json:"sex"`
}
func main(){
  person := &Person{} //创建一个对象
  var data = `{"name":"fanOne","age":"11","sex":"male"}`
  _ = json.Unmarshal([]byte(data), &person)  //将这个data序列化成person的结构体,并传入其中
  fmt.Println(person.Name)
}


3. 流程控制

3.1 条件语句

func main(){
  x :=1 
  if x == 1 {
  fmt.Println("666")
  } else {
  fmt.Println("999")
  }
}


3.2 选择语句

switch i {
  case 0:
  fmt.Printf("0")
  case 1:
  fmt.Printf("1")
  case 2:
  fmt.Printf("2")
  case 3:
  fmt.Printf("3")
  case 4, 5, 6:
  fmt.Printf("4, 5, 6")
  default:
  fmt.Printf("Default")
  }


3.3 循环语句

sum := 0
  for i := 0; i < 10; i++ {
  sum += i
  }


s := [3]int{1,2,3}
  for _,item := range s{
  fmt.Println(item)
  }


最后

小生凡一,期待你的关注。

image.png


image.png

相关文章
|
2天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
15天前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
17天前
|
存储 安全 Go
Go语言切片:从入门到精通的深度探索###
本文深入浅出地剖析了Go语言中切片(Slice)这一核心概念,从其定义、内部结构、基本操作到高级特性与最佳实践,为读者提供了一个全面而深入的理解。通过对比数组,揭示切片的灵活性与高效性,并探讨其在并发编程中的应用优势。本文旨在帮助开发者更好地掌握切片,提升Go语言编程技能。 ###
|
2月前
|
Kubernetes Go 持续交付
一个基于Go程序的持续集成/持续部署(CI/CD)
本教程通过一个简单的Go程序示例,展示了如何使用GitHub Actions实现从代码提交到Kubernetes部署的CI/CD流程。首先创建并版本控制Go项目,接着编写Dockerfile构建镜像,再配置CI/CD流程自动化构建、推送Docker镜像及部署应用。此流程基于GitHub仓库,适用于快速迭代开发。
47 3
|
2月前
|
Kubernetes 持续交付 Go
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
|
2月前
|
存储 编译器 Go
Go to Learn Go之基本数据类型
Go to Learn Go之基本数据类型
27 0
|
2月前
|
IDE Go 数据处理
Go to Learn Go之第一个Go程序
Go to Learn Go之第一个Go程序
24 0
|
3月前
|
存储 缓存 安全
|
3月前
|
编译器 Go 开发者
|
4天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
90 65