1.1什么是Go语言
示例代码
package main
import {
"net/http"
}
func main() {
http.Handle("/",http.FileServer(http.Dir(".")))
http.ListenAndServe(":8080",nil) //增加8080端口启动服务器
}
1.1.1
在Go语言里面,所有的编译结果默认都是静态链接的,只需要拷贝编译以后的唯一一个可执行文件,不需要附加任何东西就可以运行。 Go语言拥有静态编译语言里面几乎最快的编译速度。
2.2 Go的基础语法
2.2.1 Hello World
package main
import {
"fmt" //引入标准库里面的fmt包
}
func main(){
fmt.Println("Hello World")
}
2.2.2 变量+数据类型
①字符串 可以直接通过+拼接,也可以用=去比较两个字符串。 eg.
g:=a+"foo"
②整数 ③浮点型 ④布尔型
- 强类型变量,Int为例,此处默认为0
var a int
- 变量赋值
var a = 1
- 变量赋值简化
message := "hello world"
- 多变量同时赋值
var b, c int = 2, 3
变量声明方式:
①var a = "initial" ,会自动推出变量类型 var b, c int = 1, 2
②f := float32(e)
③常量:const s string = "constant"
NUMBER,STRING, BOOLEAN
int 的类型有 int, int8, int16, int32, int64, unit, unit8, unit16, unit 32, unit64, unitptr…
bool 关键字表示布尔类型。
Golang 也支持复数,用conplex64和complex128表示。
var a bool = true
vat b int = 1
var c string = "hello world"
var d float32 = 1.222
var x complex128 = cmplx.Sqrt(-5 +12i)
ARRAYS,SLICES,MAPS
Array 是同类型元素的数组。Array在声明的时候会指定长度且不能改变。定义一个固定长度为3的数组:
var a[3] int
- 多维数组定义
var multiD [2][3]int
Slices (切片)是能随时扩容的同类型元素的序列 。Slice的声明方式如下定义一个长度为0 的slices:
var b []int
或者定义一个有容量和长度的,长度为5,容量为10。
numbers := make([]int,5,10)
Slice是数组的封装,其内部实现是数组,slice有三个元素,容量,长度和指向内部数组的指针。
Slice的容量可以通过append 或者 copy函数增加。Append函数也能在数组的末尾添加元素,在容量不足的情况下会对slice扩容。
numbers = append(numbers,1,2,3,4)
另一种增加slice容量的方式是使用copy函数。Copy函数的原理是创建一个新的大容量的slice,并把原有的slice拷贝到新的slice中。
number2 :=make([]int,15)
copy(number2,number)
- maps(哈希/字典)
2.2.3 条件表达式
- if-else
与C++区别:if和else-if后面不再有括号();大括号与条件表达式位于同一行
package main
import "fmt"
func main() {
if 7%2==0 {
fmt.Println("7 is even")
}else {
fmt.Println("7 is odd")
}
if 8%4==0 {
fmt.Println("8 is divisible by 4")
}
if num:=9; num<0{
fmt.Println(num,"is negative")
}else if num<10 {
fmt.Println(num,"has 1 digit")
} else {
fmt.Println(num,"has multiple digits")
}
}
- switch
2.2.4 循环
goland只有for循环
死循环写法:
for{
}
2.2.5 range
Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。
在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
for 循环的 range 格式可以对 slice、map、数组、字符串 等进行迭代循环。
for key, value := range oldMap {
newMap[key] = value
}
range 关键字在 go 语言中是相当常用好用的,可以用在 for 循环中迭代 array、slice、map、channel、字符串所有涉及到遍历输出的东西。
2.2.6 函数
函数主要有具名和匿名之分,包级函数一般都是具名函数,具名函数是匿名函数的一种特例,当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心。
- 具名函数:
和c语言中的普通函数意义相同,具有函数名、返回值以及函数参数的函数。
func Add(a, b int) int {
return a+b
}
- 匿名函数:
指不需要定义函数名的一种函数实现方式,它由一个不带函数名的函数声明和函数体组成。
var Add = func(a, b int) int {
return a+b
}
2.2.6.1 函数传参 当可变参数是一个空接口类型时,调用者是否解包可变参数会导致不同的结果,我们解释一下解包的含义,代码如下:
func main(){
var a = []int{1, 2, 3}
Print(a...) // 解包
Print(a) // 未解包
}
func Print(a ...int{}) {
fmt.Println(a...)
}
以上当传入参数为a...时即是对切片a进行了解包,此时其实相当于直接调用Print(1,2,3)。当传入参数直接为 a时等价于直接调用Print([]int{}{1,2,3})
2.2.7 结构体
如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名。
package main
import "fmt"
type Books struct {
title string
author string
}
func main() {
var book1 Books
Book1.title = "Go 语言入门"
Book1.author = "mars.hao"
}
结构体指针 关于结构体指针的定义和申明同样可以套用前文中讲到的指针的相关定义,从而使用一个指针变量存放一个结构体变量的地址。
定义一个结构体变量的语法:var struct_pointer *Books。
这种指针变量的初始化和上文指针部分的初始化方式相同struct_pointer = &Book1,但是和c语言中有所不同,使用结构体指针访问结构体成员仍然使用.操作符。格式如下:struct_pointer.title
结构体方法
2.2.8 指针
和基础类型数据相同,在使用指针变量之前我们首先需要申明指针,声明格式如下:var var_name *var-type,其中的var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
指针的初始化就是取出相对应的变量地址对指针进行赋值:
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
空指针 当一个指针被定义后没有分配到任何变量时,它的值为 nil,也称为空指针。它概念上和其它语言的null、NULL一样,都指代零值或空值。
个人总结
感觉Go语言的知识好多好多,仿佛回到了刚上大一时学的C++一样,两者的知识点共通处很多,基础知识也比较杂,但是好好梳理的话记忆还是比较容易的。只要实践得够多,就不怕记不住啦!