go语言学习笔记(二)
整数
有符号整数
int8 int16 int32 int64
无符号整数
uin8 uin16 uin32 uin64
无符号整数 uintptr可以进行运算这点很重要请了解unsafe包,大小不明确,足以完整存放指针,uinptr只用于底层编程。
rune 类型是int32的同义词,常常用于指明一个值是unicode码点。
a:="这是golang"
for i:=0;i< len(a);i++ {
fmt.Println(a[i])
}
输出:
232
191
153
230
152
175
103
111
108
97
110
103
这是按utf8码点输出的
但是如果将a变为rune类型
package main
import "fmt"
func main(){
a:=[]rune("这是golang")
for i:=0;i< len(a);i++ {
fmt.Println(a[i])
}
}
输出:
36825
26159
103
111
108
97
110
103
按照unicode码点序列输出
常量
在编译阶段就计算出表达式的值,意义在程序运行过程中防止恶意篡改。
声明常量使用关键字const
如:const e = 1234141241(也可以指定类型当然何必多此一举?)
常量声明不需要写type,会根据右边表达式类型自动推导。
常量生成器iota 就是枚举。
逻辑运算符
&&、||、!
浮点数
float32 float64
布尔
true false
字符串
原始字符串字面量`........`
字符串和字节切片转换
字符串可以使用切片的索引方式。
常用内置函数
append
len
cap
make
new
delete
close
panic
recover
数组
具有固定长度拥有零个或多个相同类型的元素序列
var a [3]int
var b [3]int = [3]int{1,2,3}
数组长度是数组类型的一部分。[2]int [3]int是不同类型的数组。
c := [...]int{99:-1} 这个数组有100个元素其中第100个元素的值-1其他元素均为类型零值。
go语言中数组是按值传递。
切片slice
slice是一种轻量级数据结构,
type lisce struct{
data ptr //指针
len int //实际长度
cap int //容量
}
一个底层数组可以对应多个slice 并且可以相互重叠。
切片索引方[m:n]返回一个原切片类型的一个切片
slice无法做比较因为同一个slice在同一时间可能拥有不同的值。
slice只可以和nil比较,但是slice==nil不代表slice为空,还是要通过len(slice)==0判断是否为空
切片可以包含多个子切片并且当子切片一直被引用那么原切片就不会被垃圾回收如下:
func main(){
b := ftest()
fmt.Println(b)
}
func ftest()[]int{
a := []int{1,2,3,4,5,6,7,8,8,9,123,1,234,5,34,56,7}
return a[1:3]
}
上面的代码切片a一直被引用到程序结束。改正方法如下:
func ftest()[]int{
a := []int{1,2,3,4,5,6,7,8,8,9,123,1,234,5,34,56,7}
c := make([]int,2)
c = a[1:3]
return c
}
map
散列表所有的键、值都拥有相同的数据类型
a:=make(map[string]int)
map不是一个变量不可以获取地址,因为map的增长可能导致已有元素重新分配新的位置使得获取的地址无效。
map迭代顺序不固定,不同的实现方法会使用不用的散列算法
map只可以和nil比较
如果散列表的value是结构体不能直接对其进行修改会报错。
type a struct{
b int
}
m = make(map[int]a)
v = a{b:1}
m[0] = v
m[0].b = 2 //崩溃
u:=m[0]
u.b = 2
m[0] = u //正确
z=make(map[int]*a)
z[0] = *v
z[0].b++ //正确
结构体
将零个或多个任意类型的命名变量组合在一起的聚合类型。
命名的结构体类型中不可以定义一个拥有相同结构体类型的成员变量,也就是一个聚合类型不可以包含他自己,但是可以包含一个指向相同结构体类型的指针。
结构体的匿名字段
type b struct {
i int
}
type a struct {
i int
b
}
结构体a中存在匿名字段b,此时类型就是字段b的名称,类似于继承。
a结构体的字段总包含b称作b嵌入于a。
结构体中也可以嵌入接口。
当结构体中嵌入多个结构体并且其中有多个结构体的字段重名,那么外层结构体的字段会覆盖内层的结构体字段但是他们的内存空间都保留。比如:
- i 指的是结构体a中的i字段,如果想访问b可以a.b.i来访问
可比较性
如果结构体中所有成员都是可比较多那么这个结构体就是可比较的。
接口
接口即是约定,是一套必须实现的方法集蓝本,要想实现一个接口就要实现这个接口的所有方法。
package io
type Reader interface{
Read(p []byte)(n int,err error)
}
实现 io.Reader 接口
var s []byte
func (str s)(n int,err error){
return len(str),true
}
var r io.Reader = s
接口分为动态接口类型和动态接口值 上式中动态接口类型为[]byte 动态接口值为nil
类型断言
我们经常需要判断一个接口的动态类型,这时需要检测其是否为某一类型。
如果T是一个具体得到类型,写出来类似于x.(T) 检测x的动态类型是否为T,为真则返回x的动态接口值,为假则崩溃。
如果T是一个接口类型在判断动态类型是否满足这个接口。
如果类型断言出现在需要两个结果的表达式则不会崩溃。
f,ok := w.(*os.file)
类型分支类判断接口类型
switch x.(type):
case nil:
case int,uint:
case string:
default:
go语言学习笔记(二)的更多相关文章
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- C语言学习笔记二
第二章 数组 一,定义: 数组是有序数据的结合,同一数据类型 整型数组 int arr[10]={0,1,2,4,5,6,7,8,9}; 字符数组 char str[6]={'h',' ...
- 【GO】GO语言学习笔记二
基本类型: 布尔型:boolean 整型:int8,byte,int16,int,uint,uintptr等 浮点型:float32,float64 复数类型:complex64,complex128 ...
- Go语言学习笔记(二) [变量、类型、关键字]
日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变 ...
- [C语言学习笔记二] extern 函数的用法
extern 用来定义一个或多个变量.其后跟数据类型名和初始值.例如: extern int a =10 它与 int,long long int,double,char的本质区别,在于 extern ...
- C语言学习笔记二---数据类型运算符与表达式
一.C的基本语法单位 1.标识符:有效长度:31(DOS环境下) 2.关键字:main不是 3.分隔符:空格符,制表符,换行符,换页符 4.注释符:a./*.....*/ b.// 二.C的常用输 ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
随机推荐
- Java8系列 (一) Lambda表达式
函数式编程 在介绍Lambda表达式之前, 首先需要引入另一个概念, 函数式编程. 函数式编程是一种编程范式, 也就是如何编写程序的方法论.它的核心思想是将运算过程尽量写成一系列嵌套的函数调用,关注的 ...
- 使用Redis在Hibernate中进行缓存
Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和数据库表之间以及Java ...
- django-表单之模型表单(三)
models.py-->forms.py-->views.py(get)--index.html-->views.py(post)-->home.html urls.py fr ...
- dig-基本使用
dig:Domain Information Groper,是一个DNS查询工具 1:使用google的域名服务器:查询特定域名的A记录 [root@localhost ~]# dig @8.8.8. ...
- spring cloud 2.x版本 Eureka Client服务提供者教程
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1 创建eureka client 1.1 新建Srping boot工程:eureka-c ...
- 干货:.net core实现读取自定义配置文件,有源代码哦
看好多人不懂在.NET CORE中如何读取配置文件,我这里分了两篇,上一篇介绍了怎样通过appsettings.json配置读取文件信息.这一篇教大家自定义配置文件: 1.在项目下创建配置文件 { & ...
- MyBatis与Spring的整合实例详解
从之前的代码中可以看出直接使用 MyBatis 框架的 SqlSession 访问数据库并不简便.MyBatis 框架的重点是 SQL 映射文件,为方便后续学习,本节讲解 MyBatis 与 Spri ...
- python基础-字符串(str)类型及内置方法
字符串-str 用途:多用于记录描述性的内容 定义方法: # 可用'','''''',"","""""" 都可以用于定义 ...
- CVE-2019-17671:Wordpress未授权访问漏洞复现
0x00 简介 WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客 ...
- Spring 动态代理 之 but was actually of type 'com.sun.proxy.$Proxy14 Exception
今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.Bea ...