Golang 类型定义总结手册| 面试最基础
变量 var
- 关键字是 var ,定义后须被调用
- 支持多个同时定义
- 支持使用 := 缺省定义
变量定义(声明)
//使用var 关键字 进行变量定义 : var + 变量名 + 变量类型
//Var name type
var aa int = 10
//var name 省略类型
var aa = 10
// 多个进行定义,也可省略类型
var Mon, Tues, Wed, Thur, Fri, Sat, Sun int
var (
Monday int
Tuesday int
Wednesday int
Thursday int
Friday int
Saturday int
Sunday int
)
// 使用 := 快捷定义,但":=" 结构不能在函数外使用
var aa := 10
//多个定义
aa, bb :=10, '10'
//声明但可不使用
aa,_ := 10, '10'
变量调用
//变量调用分为 局部变量 和 全局变量
package main
//import
import (
"fmt"
)
//全局变量定义 aa ss
var (
aa = 3
ss = "kkk"
)
//局部变量定义
func variableZeroValue() {
var a int
var s string
//fmt.Println(a, s)
fmt.Printf("%d %q \n", a, s)
}
func main() {
//fmt.Println("helloworld")
variableZeroValue()
}
常量 const
- 关键字为 const, 可不被调用
- 枚举类型 iota
- 常量不可改变
常量定义
//const name type
//const name
//:=
//多常量
const(
aa = 1
bb =2
)
//使用iota, 从0开始,iota 自增被打断,须显式恢复
const (
b = 1 << (10 * iota)
kb
mb
gb
)
常量调用
- 常量使用与变量相似 ,故不赘述
- 与c语言不同,常量不能通过指针进行强制更改
数组 arr
- 在Go语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可以是结构类型,元素可以通过唯一的索引值访问,从0开始。
- 使用 var 关键字
数组定义
//定义 长度是5的arr
var arr [5]int
//定义并初始化
var arr [5]int = [5]int{1,2,3,4,5}
//快速定义
arr := [5]int{1,2,3,4,5}
//不知长度
arr := [...]int{1,2,3,4}
//部分初始化, 其他位置初始化为0
arr := [5]int{1:1,3:4}
调用
package main
import "fmt"
func main() {
array := [2]int{}
fmt.Printf("数组长度:%d,数组容量:%d\n", len(array), cap(array))
}
//数组长度:2,数组容量:2
切片 Slice
- "动态数组" ,长度不固定,可以追加 append (name, 5)
- 通过内部指针和相关属性应用数组片段
- type, len, cap 为Slice三个属性, 如果slice == nil 则len,cap均为零
定义
//定义一个切片,不用大小
var name []int
//定义并初始化
var aa []int = []int{1,2,3}
var bb = []int{1,2,3}
//通过内置函数make 进行定义 make (type, len, cap)
var aa []int = make([]int, 3)
var aa = make([]int, 3)
var aa = make([]int, 3, 3)
aa := make([]int, 3)
//通过切数组得到 arr := [5]int{1,2,3,4,5}
aa := arr[:len(arr)-1]
调用
切片拷贝,使用copy() 函数 copy 在两个 slice 间复制数据,复制长度以 len 小的为准。两个 slice 可指向同一底层数组,允许元素区间重叠。
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5}
b := []int{100, 200}
copy(a, b)
fmt.Println(a, b)
}
运行结果:
[100 200 3 4 5] [100 200]
容器 Map
- key- value 表
- 无序,散列表hash完成
- 可使用内置函数delete(m, "key"), 不可以在map上使用cap()方法。
定义
//声明
var m map[int]string
//声明并初始化
var m map[int]string {1;"1",2;'2'}
//通过make 创建
var m1 = make(map[int]string, 10)
m2 = make(map[int]string, 10)
调用
//增
m[3] = "3"
//删,删除操作,如果 key 不存在,不会出错
delete(m, "3")
//改
m[1] ='2'
//查
if _, ok = m[3]; ok{
fmt.Println("find it")
}
//长
len := len(m)
管道 Channel
看成管道, 可单双向使用, chan 定义
无缓冲的与有缓冲channel有着重大差别,那就是一个是同步的 一个是非同步的。 比如
无缓冲chan:ch1:=make(chan int)
有缓冲chan:ch2:=make(chan int,1)
无缓冲: ch1<-1 不仅仅是向 c1 通道放 1,而是一直要等有别的携程 <-ch1 接手了这个参数,那么ch1<-1才会继续下去,要不然就一直阻塞着。
有缓冲: ch2<-1 则不会阻塞,因为缓冲区大小是1(其实是缓冲大小为0),只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。
缓冲区是内部属性,并非类型构成要素。
普通 channel 可以隐式转为只读channel或只写channel,反过来则不行
内置函数 len() 返回未被读取的缓冲元素数量,使用内置函数 cap() 返回缓冲区大小
使用内置函数 close() 进行关闭 chan,向已经关闭的 channel 发送数据会引发 panic 错误。
定义
//使用chan 定义
var aa chan int
var aa chan string
var aa chan map[int]string
//make 定义
var aa = make(chan int) //无缓冲
var aa = make(chan int, 10) //有缓冲
//只读
var aa <-chan int
var aa = make(<-chan int, 10)
//只写
var aa chan<- int
var aa = make(chan<-int, 10)
调用
//开
var aa = make(chan int, 3)
//放
aa <- 1
//关
close(aa)
指针
- *(取值符) 来获取指针所指向的内容 , &(取地址符)来获取该变量的指针。
- 不可加减乘除,Go语言是不允许两个指针类型进行转换的
- 空指针 nil
- unsafe.Pointer 类型用于表示任意类型的指针
定义
//使用var 进行
var p *int
//使用:= 定义
var str string
p := &str
//指针变量的指针
var **p int
//time.Time (一个结构体)值的指针
var t *time.Time
结构体
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
struct 特点
1、用来自定义复杂数据结构
2、struct里面可以包含一个或多个字段(属性)
3、struct类型可以定义方法,注意和函数的区分
4、struct类型是值类型
5、struct类型可以嵌套
6、结构体是用户单独定义的类型,不能和其他类型进行强制转换
7、Go中的struct没有构造函数,一般可以使用工厂模式来解决这个问题
8、我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化
9、访问结构体成员, 用 "." 来连接,格式为:"结构体.成员名"
定义
//全局或函数内定义类型
type bight int64
//定义新类型,不能同时嵌入某一类型和其指针类型(名字相同)
type moreType struct{
linux string
win string
debin string
}
type lin stuct{
*linux
}
//声明struct结构的时候,在属性的右侧用小米点括起来的内容叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。例如转成json格式
user := &User{UserId: 1, UserName: "helloworld"}
json_user, _ := json.Marshal(user)
fmt.Printf("struct User echo : %v\n", string(json_user))
user_tag := &UserTag{UserId: 1, UserName: "helloworld"}
json_user_tag, _ := json.Marshal(user_tag)
fmt.Printf("struct UserTag echo : %v\n", string(json_user_tag))
函数
定义
//无参数
func funName(){
}
//有参数
func funName(x, y int){
}
//一返回值
func funName(x, y int) int{
}
//多返回
fun funNmame(x,y int)(ret int, err error){
}
//只有类型
fun funNmame(int, int)(int, error){
}
1、Go语言函数中的参数不支持默认值。
2、无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。
3、map、slice、chan、指针、interface默认以引用的方式传递。
4、函数的可变参数只能有一个,且必须是最后一个。
5、在参数赋值时可以不用用一个一个的赋值,可以直接传递一个数组或者切片,特别注意的是在参数后加上“…”即可。
特殊函数
//匿名函数
var sum func(int, int) int = func(x, y int)int{return x+y}
sum := func(x, y int)int{return x+y}
//递归函数
func factorial(i int) int {
if i <= 1 {
return 1
}
return i * factorial(i-1)
}
延时调用 defer 注意
- 当defer被声明时,参数被实时解析
- defer执行顺序为先进后出。
- defer 可以读取有名返回值
Golang 类型定义总结手册| 面试最基础的更多相关文章
- Golang通脉之类型定义
自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. type是Go语法里的重要而且常用的关键字,type绝 ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)
在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...
- 2018.5.14 XML文档类型定义----DTD
1.DTD概述 一个完全意义上的XML文件不仅仅是Well-fromed(格式良好的),而且还应该是使用了一些自定义的标记ValidatingXMl(有效的)文档也就是说他必须遵守文档类型的定义中已声 ...
- 为类型定义取别名、环境变量、静态库与动态库(day03)
一.为类型命名别名 struct node{ int num; struct node *next; }; typedef struct node node_t; node_t n; 使用typede ...
- golang自己定义数据类型查询与插入postgresql中point数据
golang自己定义数据类型查询与插入postgresql中point数据 详细代码例如以下: package main import ( "bytes" "databa ...
- java面试| 精选基础题(3)
每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 系列文章 java面试| 精选基础题(1) java面试|精选基础题(2) 1.float f=3.4;是否正确? 答:不正确,编译无法通过 ...
- java面试| 精选基础题(2)
关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...
- CesiumJS新增官方TypeScript类型定义
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 在当前的1.70版本中,CesiumJS现在附带了正式的Type ...
随机推荐
- 02-22 决策树C4.5算法
目录 决策树C4.5算法 一.决策树C4.5算法学习目标 二.决策树C4.5算法详解 2.1 连续特征值离散化 2.2 信息增益比 2.3 剪枝 2.4 特征值加权 三.决策树C4.5算法流程 3.1 ...
- Cocos Creator实现大炮英雄,附代码!
游戏预览 开始场景 搭建开始场景 摆放一个背景图,在背景图上添加背景地面.开始按钮.4个角色选择按钮.游戏logo. 创建游戏脚本 1. 实现开始按钮的回调,点击开始按钮,跳转到游戏场景.跳转 ...
- 对象模型(Object-Model):关于vptr、vtbl
当一个类本身定义了虚函数,或其父类有虚函数时,为了支持多态机制,编译器将为该类添加一个虚函数指针(vptr).虚函数指针一般都放在对象内存布局的第一个位置上,这是为了保证在多层继承或多重继承的情况下能 ...
- Oracle注入之带外通信
Oracle注入之带外通信和DNSLOG注入非常相似,例如和mysql中load_file()函数实现无回显注入非常相似. 下面介绍这个技术中常用的函数和使用. 环境这里准备两台测试,一台注入点的靶机 ...
- Msfvenom命令总结大全
1. –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...
- 代码审计-四叶草杯线下awd比赛源码web2
今晚简单来看看那天比赛的源码吧,比赛的时候还是有些慌没有好好去静下心看代码. awd给的题中的漏洞,都是那种可以快速让你利用拿到权限后得到flag的那种,特别复杂利用的一般没有. 建议先黑盒去尝试,例 ...
- 机器学习:数据清洗及工具OpenRefine
数据分析中,首先要进行数据清洗,才可以继续训练模型,预测等操作. 首先介绍一下什么是数据清洗(定义来自 百度百科,有删减) 数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别 ...
- 理解JavaScript中的堆和栈
这里先说两个概念:1.堆(heap)2.栈(stack)堆 是堆内存的简称.栈 是栈内存的简称.说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事.各种语言在处理堆栈的原理上都大 ...
- 对新手严重不友好的强者——Nginx那些俯拾皆是的坑
1.if和后边的括号要隔一个空格,变量后面也要有空格. 2.location / 和location = / 的意味不一样.前面的是通用匹配,后面的匹配根节点访问请求,前面的使用不好很容易引发重定向过 ...
- opencv::模板匹配(Template Match)
模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...