golang

Golang中的error类型

末鹿安然 提交于 2020-02-01 00:15:59
Golang中的error类型 error类型本身就是一个预定义好的接口,里面定义了一个method type error interface { Error() string } 生成一个新的error并返回 一般有以下几种处理方式: package main import ( "errors" "fmt" ) type Customerror struct { infoa string infob string Err error } func (cerr Customerror) Error() string { errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error()) return errorinfo } func main() { //方法一: //采用errors包的New方法 返回一个err的类型 var err error = errors.New("this is a new error") //由于已经实现了error接口的方法 因此可以直接调用对应的方法 fmt.Println(err.Error()) //方法二: //采用fmt.Errof

golang Mysql -- Tx

浪子不回头ぞ 提交于 2020-02-01 00:11:43
Transaction 事务 事务处理是数据的重要特性。尤其是对于一些支付系统,事务保证性对业务逻辑会有重要影响。golang的mysql驱动也封装好了事务相关的操作。我们已经学习了db的Query和Exec方法处理查询和修改数据库。 tx对象 一般查询使用的是db对象的方法,事务则是使用另外一个对象。sql.Tx对象。使用db的Begin方法可以创建tx对象。tx对象也有数据库交互的Query,Exec和Prepare方法。用法和db的相关用法类似。查询或修改的操作完毕之后,需要调用tx对象的Commit提交或者Rollback方法回滚。 一旦创建了tx对象,事务处理都依赖与tx对象,这个对象会从连接池中取出一个空闲的连接,接下来的sql执行都基于这个连接,直到commit或者rollback调用之后,才会把连接释放到连接池。 在事务处理的时候,不能使用db的查询方法,虽然后者可以获取数据,可是这不属于同一个事务处理,将不会接受commit和rollback的改变,一个简单的事务例子如下: tx, err := db.Begin() tx.Exec(query1) tx.Exec(query2) tx.commit() 在tx中使用db是错误的: tx, err := db.Begin() db.Exec(query1) tx.Exec(query2) tx.commit()

112. 路径总和 golang

試著忘記壹切 提交于 2020-01-31 23:26:08
Me func hasPathSum ( root * TreeNode , sum int ) bool { if root == nil { return false } if root . Val == sum && root . Left == nil && root . Right == nil { return true } return hasPathSum ( root . Left , sum - root . Val ) || hasPathSum ( root . Right , sum - root . Val ) } 来源: CSDN 作者: 寇浩哲 链接: https://blog.csdn.net/csdn_kou/article/details/104123379

101. 对称二叉树 golang

▼魔方 西西 提交于 2020-01-31 17:42:08
Me func isSymmetric(root *TreeNode) bool { if root == nil { return true } return isSymmetric1(root.Left, root.Right) } func isSymmetric1(TN1 *TreeNode, TN2 *TreeNode) bool { if TN1 == nil && TN2 == nil { return true } if TN1 == nil || TN2 == nil { return false } if TN1.Val != TN2.Val { return false } return isSymmetric1(TN1.Left,TN2.Right) && isSymmetric1(TN1.Right, TN2.Left) } 来源: CSDN 作者: 寇浩哲 链接: https://blog.csdn.net/csdn_kou/article/details/104123579

Golang中string和[]byte的对比

梦想与她 提交于 2020-01-31 13:59:57
golang string和[]byte的对比 为啥string和[]byte类型转换需要一定的代价? 为啥内置函数copy会有一种特殊情况 copy(dst []byte, src string) int ? string和[]byte,底层都是数组,但为什么[]byte比string灵活,拼接性能也更高( 动态字符串拼接性能对比 )? 今天看了源码探究了一下。 何为string? 什么是字符串?标准库 builtin 的解释: type string string is the set of all strings of 8-bit bytes, conventionally but not necessarily representing UTF-8-encoded text. A string may be empty, but not nil. Values of string type are immutable. 简单的来说字符串是一系列8位字节的集合,通常但不一定代表UTF-8编码的文本。字符串可以为空,但不能为nil。而且字符串的值是不能改变的。 不同的语言字符串有不同的实现,在go的源码中 src/runtime/string.go ,string的定义如下: type stringStruct struct { str unsafe.Pointer len

golang获取重定向的地址

与世无争的帅哥 提交于 2020-01-31 13:33:05
http模块默认跟随重定向 使用http.Get,当遇到301跳转时,会获取重定向后的内容 res, err := http.Get(url) if err != nil { logrus.Error(err) return nil, err } //这里的状态是200 fmt.println(res.StatusCode) 获取页面重定向的location 为了获取重定向的location,要重新实现一个http.Client,例子如下: baseHost := "https://www.example.com/" client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, } res, err := client.Get(baseHost) if err != nil { return baseHost } if res.StatusCode != 301 { return baseHost } return res.Header.Get("Location") 来源: https://www.cnblogs.com/xiaohunshi/p/12244962.html

455. 分发饼干 golang

試著忘記壹切 提交于 2020-01-30 19:44:12
455. 分发饼干 Me func findContentChildren(g []int, s []int) int { if len(s) == 0 { return 0 } sort.Ints(g) sort.Ints(s) var count, i, j int = 0, 0, 0 for { if g[i] <= s[j] { i, j, count = i+1, j+1, count+1 } else { j++ } if i >= len(g) || j >= len(s) { return count } } return count } 来源: CSDN 作者: 寇浩哲 链接: https://blog.csdn.net/csdn_kou/article/details/104117341

160. 相交链表 golang

試著忘記壹切 提交于 2020-01-30 13:45:06
求两个链表相交 Me func getIntersectionNode(headA, headB *ListNode) *ListNode{ if headA == nil { return headA } if headB == nil { return headB } l1 := headA l2 := headB var a int = 0 node := l1 for node != nil { a += 1 node = node.Next } var b int = 0 node = l2 for node != nil { b += 1 node = node.Next } if a > b { num := a-b for i:=0; i < num; i ++ { l1 = l1.Next } } else if a < b { num := b - a for i := 0; i < num; i++ { l2 = l2.Next } } for l1 != l2 { if l1 == nil { return headB } else { l1 = l1.Next } if l2 == nil { return headA } else { l2 = l2.Next } } return l1; } 来源: CSDN 作者: 寇浩哲 链接: https:/

原创 Golang学习日志 ━━ map等类型的指针分析

☆樱花仙子☆ 提交于 2020-01-30 10:19:01
学习时遇到了map内含结构体,却不能使用 map[string].int=1 的方式进行直接修改,查了一下是因为golang出于安全原因,将map中的索引的值设定为不可寻址,即意味着无法直接修改该map索引下结构体内的字段。 解决方法也很简单,其中一种就是让map记住结构体的指针,而不是结构体本身。这样根据结构体指针就能找到该结构体及其字段了。 type archive struct { name string age int } v1 := map [ int64 ] * archive { 10010 : & archive { name : "xiaoli" , age : 1 , } , } fmt . Println ( "v1[10010].age:" , v1 [ 10010 ] . age ) // v1[10010].age: 1 v1 [ 10010 ] . age = 2 fmt . Println ( "v1[10010].age:" , v1 [ 10010 ] . age ) // v1[10010].age: 2 fmt . Printf ( "v1:%v %T %p\n" , v1 , v1 , v1 ) // v1:map[10010:0xc000004660] map[int64]*pkg.archive 0xc00006eb70

Golang 接口

霸气de小男生 提交于 2020-01-30 01:09:29
定义 把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口 举例 接口Phone, 有一个函数call type Phone interface { call() } 定义2个strct type NokiaPhone struct { } type Samsung struct { } 实现接口中的call()函数 func (nokiaPhone NokiaPhone) call() { fmt.Println("I'm NokiaPhone, call.....") } func (samsung Samsung) call() { fmt.Println("I'm Sumsung, call........") } 测试 var phone Phone phone = new(NokiaPhone) fmt.Printf("%p, %T", phone, phone) // %p 输出指针地址,%T 输出类型 phone.call() phone = new(Samsung) phone.call() 输出 0x121bf38, *basicTest.NokiaPhone I'm NokiaPhone, call..... I'm Sumsung, call........ 注意:new 得到的是个指针 来源: https://www