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学习指南>第二版.<数学分 ...
随机推荐
- Yii2.0教程应用结构篇 —— 入口脚本
入口脚本是应用启动流程中的第一环,一个应用(不管是网页应用还是控制台应用)只有一个入口脚本.终端用户的请求通过入口脚本实例化应用并将将请求转发到应用. Web 应用的入口脚本必须放在终端用户能够访问的 ...
- python3.x以上 爬虫 使用问题 urllib(不能使用urllib2)
问题一: python 3.x 以上版本揽括了 urllib2,把urllib2 和 urllib 整合到一起. 并且引入模块变成一个,只有 import urllib # import urllib ...
- Windows下NFS服务器SFU设置(可以共享linux系统)
一.安装SFU1.下载软件SFU http://download.microsoft.com/download/a/1/c/a1ca7af1-a6e3-46e7-874a-4c5d8c0fb3b7/S ...
- NodeJs 实现 WebSocket 即时通讯(版本一)
服务端代码 var ws = require("nodejs-websocket"); console.log("开始建立连接...") var game1 = ...
- 重新认识MySQL中的COUNT语句
在数据库的增删改查操作中,使用最频繁的就是查询操作. 而在所有查询操作中,统计数量操作更是经常被用到. 关于数据库中行数统计,无论是MySQL还是Oracle亦或者是SqlServer,都有一个函数可 ...
- ABP WebApi的请求类型
Api对应的请求类型分为以下四种方法: 1.POST 2.PUT 3.DELETE 4.GET 一般abp的请求类型都是根据接口命名来定义的,Create——POST,Delete——DELETE,U ...
- 学习笔记50_mongodb
MongoVUE,MongoDB可视化客户端: 添加一个连接: 数据库下就是集合. 实际上是json数据的集合 Mongodb->数据库->文档集合:相当于表->文档:相当于表里面的 ...
- csps63总结
这次考试还算可以(吧),暴力都没打满,但是还差很多. T1 强烈推荐我的打法,很好理解并且很好打(虽然稍长) 维护指针指向的值及其是第几个数,然后分类讨论. (诡异构造的序列==随机数据)?? #in ...
- Vue的指令以及组件化开发
一. 自定义指令 如何: 1. 创建指令 Vue.directive("指令名",{ inserted(elem){//指令所在的元素被加载到DOM树上后自动执行指令 //elem ...
- 对学习Python自然语言处理的一点儿感悟
研究生阶段,如果一开始找不到知识点,那就结合导师的研究课题以及这个课题设计到的知识领域,扎好基础知识能力.以我研究的自然语言处理领域为例,如果一开始不知道研究点,且又要安排学习计划,那么我会在选择: ...