
语法这东西基本是每个编程语言必须的吧!
比如:
接下来的小节,会主要是对这些基础的语法的东西最简单的实践笔记.
以下的搬砖总结笔记·,我仅仅是提取我核心需要记录的来记录!
搬砖资料来源:
http://c.biancheng.net/view/21.html
https://www.runoob.com/go
变量是一种使用方便的占位符,用于引用计算机内存地址。
package main
import "fmt"
func main() {
//声明的变量一定要被使用!
//=====================变量的定义=====================
// 定义字符串类型的变量-并初始化
var a string = "Runoob"
fmt.Println(a)
// 定义整型类型的变量,并初始化,可以同时定义多个
var b, c int = 1, 2
fmt.Println(b, c)
// 没有初始化就为零值
var e int
fmt.Println(e)
// bool 零值为 false
var f bool
fmt.Println(f)
//=====================: =局部变量的定义=====================
var test = "你好"
fmt.Println(test)
//test: = "啥都好说" //经使用 var 声明过了,再使用 := 声明变量,就产生编译错误,格式:
xiaozhong := 1 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句
fmt.Println(xiaozhong)
//=====================: 多变量的同时的定义=====================
var vname1, vname2, vname3 = "v1", 2, 3 // 和 python 类型,不需要显示声明类型,它可以自动推断
fmt.Println(vname1, vname2, vname3)
//vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
}
示例代码:
package main
import "fmt"
//定义一个函数
func GetData() (string, int) {
return "你好", 2021
}
func main() {
//返回返回两个值,但是对返回的值进行有所取舍的操作
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
}
执行结果:
你好 2021
常量变量
全局变量:
局部变量:
形式参数:
一些概念的理解:
变量是一种使用方便的占位符,用于引用计算机内存地址。
变量的内存地址的获取方法是:& 变量值
指针概念中的两个核心概念点:
梳理理解点:
ptr := &v // v 的类型为 T,任意的变量的类型
其中 v 代表被取地址的变量,变量 v 的地址使用【变量 ptr 】进行接收,ptr 的类型为【*T】,称做 【T 的指针类型】,*代表指针。总结:变量、指针和地址三者的关系是,每个变量都拥有地址,指针的值就是地址。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
白话理解:
ptr := &v
1: &v 返回的是V变量的指针地址(内存地址)
2:ptr 保存了V变量的指针地址(内存地址)的地址
3:ptr这个变量的类型叫做 v变量的指针类型
4:*ptr 通过【*指针类型变量】可以获取到变量v原来的值(不是内存地址)
示例代码1:
package main
import (
"fmt"
)
func main() {
//声明整型变量 cat。
var cat int = 1
//声明字符串变量 str。
var str string = "banana"
//使用 fmt.Printf 的动词%p打印 cat 和 str 变量的内存地址,指针的值是带有0x十六进制前缀的一组数据。
fmt.Printf("%p %p", &cat, &str)
}
执行结果:
指针的值是带有0x十六进制前缀的一组数据。
示例代码2:
使用&操作符对普通变量进行取地址操作并得到变量的指针后,可以对指针使用操作符,也就是指针取值,代码如下:
取地址操作符&和取值操作符是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
# new() 函数可以创建一个对应类型的指针,创建过程会分配内存,被创建的指针指向默认值。
str := new(string)
*str = "Go语言教程"
fmt.Println(*str)
// 输出 Go语言教程
栈(Stack)定义:是一种比较特殊线性表的数据结构,可以用于内存的分配。
堆(heap)定义:也是一种数据结构,用于存放进程执行中被动态分配的内存段。
栈(Stack)的特点:
堆(heap)的特点:
其实这个词我也不太明白是啥,后来百度一番理解收,其实总结下来就是:
这个所谓的变量逃逸其实糗事,让程序的自动化决定变量的分配内存的方式、是分配堆内存黑栈内存,由GO编译器自动化进行完成选择,开发者就不用纠结这个分配的方式的问题。
编译器觉得变量应该分配在堆和栈上的原则是:
iota 常量生成器(这个用着估计比较难理解,有些地方需要多用才知道!)
‘容器’:是对数据的存贮和祖师的数据的一种方式的统称。常见的类型:
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
以下演示了数组初始化:
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或用 ... 代替数组的长度
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
package main
import (
"fmt"
)
func main() {
// 声明数组的同时快速初始化数组
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
/* 输出数组元素 */
for i := 0; i < 5; i++ {
fmt.Printf("balance[%d] = %f\n", i, balance[i])
}
fmt.Printf("==============")
for k, v := range balance {
fmt.Printf("balance[%d] = %f\n", k, v)
}
// 输出 Go语言教程
}
其实和py切片差不多!
var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
也可以指定容量,其中 capacity 为可选参数。
make([]T, length, capacity)
切片初始化
s :=[] int {1,2,3 }
直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
s :=[] int {1,2,3 }
s[:]
s :=[] int {1,2,3 }
s[0:0]
package main
import (
"fmt"
)
func main() {
// 声明数组的同时快速初始化数组
s := []int{1, 2, 3}
s = append(s, 0)
fmt.Printf(" %d\n", s)
// 输出 [1 2 3 0]
}
切片的删除:
package main
import (
"fmt"
)
func main() {
// 声明数组的同时快速初始化数组
s := []int{1, 2, 3}
s = append(s, 0)
fmt.Printf(" %d\n", s)
// 输出 [1 2 3 0]
//删除切片的指定的位置
del_index := 1
s = append(s[:del_index], s[del_index+1:]...)
fmt.Printf(" %d\n", s)
}
完全来自:https://www.runoob.com/go/go-map.html
我的主要是执行一次代码而已!
PS: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)
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap [ "France" ] = "巴黎"
countryCapitalMap [ "Italy" ] = "罗马"
countryCapitalMap [ "Japan" ] = "东京"
countryCapitalMap [ "India " ] = "新德里"
/*使用键输出地图值 */
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [country])
}
/*查看元素在集合中是否存在 */
capital, ok := countryCapitalMap [ "American" ] /*如果确定是真实的,则存在,否则不存在 */
/*fmt.Println(capital) */
/*fmt.Println(ok) */
if (ok) {
fmt.Println("American 的首都是", capital)
} else {
fmt.Println("American 的首都不存在")
}
}
输出结果:
France 首都是 巴黎
Italy 首都是 罗马
Japan 首都是 东京
India 首都是 新德里
American 的首都不存在
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap["France"] = "巴黎"
countryCapitalMap["Italy"] = "罗马"
countryCapitalMap["Japan"] = "东京"
countryCapitalMap["India "] = "新德里"
/*使用键输出地图值 */
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap[country])
}
/*查看元素在集合中是否存在 */
capital, ok := countryCapitalMap["American"] /*如果确定是真实的,则存在,否则不存在 */
/*fmt.Println(capital) */
/*fmt.Println(ok) */
if ok {
fmt.Println("American 的首都是", capital)
} else {
fmt.Println("American 的首都不存在")
}
/*删除元素*/
delete(countryCapitalMap, "France")
fmt.Println("法国条目被删除")
fmt.Println("删除元素后地图")
/*打印地图*/
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap[country])
}
}
申请的GO竟然没提供方法~!清空的map的方法,唯一办法竟然是重新make一个新的map!
这个后续学习到sync.map的时候再去了解一下。
1) 通过 container/list 包的 New() 函数初始化 list
变量名 := list.New()
2) 通过 var 关键字声明初始化 list
var 变量名 list.List
双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack。
l := list.New()
l.PushBack("fist")
l.PushFront(67)
遍历双链表需要配合 Front() 函数获取头元素,遍历时只要元素不为空就可以继续进行,每一次遍历都会调用元素的 Next() 函数,代码如下所示:
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
// 尾部添加
l.PushBack("canon")
// 头部添加
l.PushFront(67)
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
END
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
公众号:微信搜【小儿来一壶枸杞酒泡茶】
小钟同学 | 文 【欢迎一起学习交流】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,部分内容参考自互联网整理,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。