golang
青石玄霄
吾生也有涯,而知也无涯
展开
-
go 反射
反射就是Reflection,是指程序在运行期可以拿到一个对象的所有信息package mainimport ( "fmt" "reflect")func printMeta(obj interface{}) { //pair:<value, type> t := reflect.TypeOf(obj) n := t.Name() k := t.Kind() v := reflect.ValueOf(obj) fmt.Printf("Type:%s Type.n原创 2021-07-01 23:49:42 · 80 阅读 · 0 评论 -
接口
package mainimport ( "fmt" "math")type geometry interface { area() float64 perim() float64}type rect struct { width, height float64}type circle struct { radius float64}func (r rect) area() float64 { return r.wid...原创 2021-03-25 10:34:31 · 54 阅读 · 0 评论 -
稀疏数组
编写的五子棋程序中,有存盘退出和续上盘的功能当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:1) 记录数组一共有几行几列,有多少个不同的值2) 思想:把具有不同值的元素的行列及值记录在一个小规模的数组中,从而 缩小程序的规模...原创 2020-08-02 10:43:05 · 92 阅读 · 0 评论 -
使用select解决从管道取数据的阻塞问题
package mainimport ( "fmt" "time")func main() { //使用select可以解决从管道取数据的阻塞问题 //1.定义一个管道 10个数据int intChan := make(chan int, 10) for i := 0; i < 10; i++ { intChan<- i } //2.定义一个管道 5个数据string stringChan := make(chan string, 5) for i := 0.原创 2020-06-17 22:07:28 · 511 阅读 · 0 评论 -
go协程
Go 主线程(有程序员直接称为线程/也可以理解成进程): 一个 Go 线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程[编译器做优化]。Go 协程的特点有独立的栈空间 共享程序堆空间 调度由用户控制 协程是轻量级的线程...原创 2020-06-14 20:50:19 · 224 阅读 · 0 评论 -
单元测试
1) 测试用例文件名必须以 _test.go 结尾。 比如 cal_test.go , cal 不是固定的。2) 测试用例函数必须以 Test 开头,一般来说就是 Test+被测试的函数名,比如 TestAddUpper3) TestAddUpper(t *tesing.T) 的形参类型必须是 *testing.T 【看一下手册】4) 一个测试用例文件中,可以有多个测试用例函数,比如 TestAddUpper、TestSub5) 运行测试用例指令(1) cmd>go test [如果运行正确原创 2020-06-14 17:30:40 · 109 阅读 · 0 评论 -
json序列化及反序列化
package mainimport ( "fmt" "encoding/json")//定义一个结构体type Monster struct { Name string `json:"monster_name"` //反射机制 Age int `json:"monster_age"` Birthday string //.... Sal float64 Skill string}func testStruct() { //演示 monster := Monster{.原创 2020-06-14 15:33:19 · 164 阅读 · 0 评论 -
flag解析命令行参数
package mainimport ( "fmt" "flag")func main() { //定义几个变量,用于接收命令行的参数值 var user string var pwd string var host string var port int //&user 就是接收用户命令行中输入的 -u 后面的参数值 //"u" ,就是 -u 指定参数 //"" , 默认值 //"用户名,默认为空" 说明 flag.StringVar(&user, ".原创 2020-06-14 15:02:56 · 1408 阅读 · 0 评论 -
家庭收支代码
main.gopackage mainimport( "fmt" "go_code/familyaccount/utils")func main() { fmt.Println("这个是面向对象") utils.NewFamilyAccount().MainMenu()}familyaccount.gopackage utilsimport( "fmt")type FamilyAccount struct{ key string loop bool b原创 2020-06-13 16:36:16 · 374 阅读 · 0 评论 -
继承
package mainimport ( "fmt")type A struct { Name string age int}func (a *A) SayOk() { fmt.Println("A SayOk", a.Name)}func (a *A) hello() { fmt.Println("A hello", a.Name)}type B struct { A Name string }func (b *B) SayOk() { fmt.Prin.原创 2020-06-11 22:45:15 · 67 阅读 · 0 评论 -
go面向对象
把一类事物的共有的 属性( 字段)和 行为( 方法)提取出来,形成一个 物理模型(结构体)。这种研究问题的方法称为抽象封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作封装的好处1) 隐藏实现细节2) 可以对数据进行验证,保证安全合理封装的实现步骤1) 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似 private)2) 给结构体所在包提供一个工厂模式的函数,首字原创 2020-06-10 23:39:26 · 164 阅读 · 0 评论 -
Golang 语言面向对象
1) Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。2) Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解 Golang 是基于 struct 来实现 OOP 特性的。3) Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函数、隐藏的 this 指针等等4) Gola原创 2020-06-07 22:04:36 · 156 阅读 · 0 评论 -
golang的map
1) map 在使用前一定要 make2) map 的 key 是不能重复,如果重复了,则以最后这个 key-value 为准3) map 的 value 是可以相同的.4) map 的 key-value 是无序原创 2020-06-06 23:44:08 · 158 阅读 · 0 评论 -
二维数组
二维数组的本质就是一维数组,数组里面的元素是一维数组,内存布局如下图arr2可以看成一个一维数组,里面有两个元素,分别存放的是另外一个一维数组的地址原创 2020-06-06 23:06:30 · 97 阅读 · 0 评论 -
二分查找
二分查找的思路: 比如我们要查找的数是 findVal1. arr是一个有序数组,并且是从小到大排序2. 先找到 中间的下标 middle = (leftIndex + rightIndex) / 2, 然后让 中间下标的值和findVal进行比较2.1 如果 arr[middle] > findVal , 就应该向 leftIndex ---- (middle - 1)2.2 如果 arr[middle] < findVal , 就应该向 middel+1---- right...原创 2020-06-06 22:39:47 · 76 阅读 · 0 评论 -
排序
二分查找二分查找的思路: 比如我们要查找的数是 findVal1. arr是一个有序数组,并且是从小到大排序2. 先找到 中间的下标 middle = (leftIndex + rightIndex) / 2, 然后让 中间下标的值和findVal进行比较2.1 如果 arr[middle] > findVal , 就应该向 leftIndex ---- (middle - 1)2.2 如果 arr[middle] < findVal , 就应该向 middel+1...原创 2020-06-06 21:16:12 · 100 阅读 · 0 评论 -
切片
1、slice 的确是一个引用类型2.、slice 从底层来说,其实就是一个数据结构(struct 结构体)type slice struct { ptr *[2]int len int cap int}切片的使用1、定义一个切片,然后让切片去引用一个已经创建好的数组//演示切片的基本使用var intArr [5]int = [...]int{1, 22, 33, 66, 99}//声明/定义一个切片//slice := intArr[1:3]/.原创 2020-06-04 23:22:49 · 177 阅读 · 0 评论 -
for range
原创 2020-06-03 23:22:55 · 140 阅读 · 0 评论 -
go细节
1) 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct2) 引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型原创 2020-06-03 22:43:52 · 99 阅读 · 0 评论 -
补码
package mainimport( "fmt")func main(){ //位运算 fmt.Println(2&3) //2 fmt.Println(2|3) //3 fmt.Println(2^3) //3 fmt.Println(-2^2) //-4}右移运算符 >>: 低位溢出, 符号位不变, 并用符号位补溢出的高位左移运算符 <<: 符号位不变, 低位补 ...原创 2020-06-02 22:46:52 · 144 阅读 · 0 评论 -
闭包
闭包含义原创 2020-06-02 22:30:36 · 147 阅读 · 0 评论 -
递归
使用递归的方式,求出斐波那契数 1,1,2,3,5,8,13......给你一个整数n,求出它的斐波那契数是多少?思路:当n==1 || n==2,返回1 当n>=2,返回前面两个数的和f(n-1)+f(n-2)代码:func fbn(n int) int{ if(n == 1 || n == 2){ return 1 }else{ return fbn(n - 1) + fbn(n - 2) }}...原创 2020-05-31 22:26:29 · 408 阅读 · 0 评论