go自学笔记

Go语言

go项目结构图

在这里插入图片描述

导包

也就是import “fmt”

如果导入包就必须使用

变量

//定义一个变量输出出来
var a int
fmt.Println("a的值是",a)
a = 10
fmt.Println("a赋值之后是",a)

//还可以定义多个变量之间用逗号隔开
//定义的变量必须使用
var b,c int
b = 20
c = 30
fmt.Println("b是",b,"c是",c)

//变量的初始化
var d int = 100 //变量的初始化
d = 200  //变量的赋值
fmt.Println("d的值",d)

//变量自动推导类型  %T是获取变量的类型
//Printf是推导类型
f := 30
fmt.Printf("f 的类型是%T",f)
//声明一个变量a 并赋值
var a int = 10
fmt.Println("a的值",a)
a = 20
fmt.Println("a的值",a)
//变量的赋值可以给同名的n次
//但是声明的变量名是唯一的只能声明一次

//:=是自动推导类型  :是先声明一个变量 =是赋值
b := 30
fmt.Println("b的值",b)
c := 40
fmt.Println("a的值",a,"b的值",b,"c的值",c)
fmt.Printf("a= %d,b = %d,c = %d\n",a,b,c)
//多重复值 数值的交换
//传统的方法
a := 10
b := 20
var temp int
temp = a
a = b
b = temp
fmt.Println(a, b)

//go语言的优势
a, b = 20, 10
fmt.Println(a, b)

/*匿名函数
声明三个变量的值
_表示丢弃
 */
var i, j, h int
i, _, h = 1,2,3
fmt.Println(i, j, h)

常量

//定义一个常量
const a = 10
fmt.Println("常量的值是",a)
fmt.Printf("a typr is %T",a)

常量变量组合

//定义多个变量
var (
   //可以初始化变量的值
   //可以不写类型 自动推导
   a int
   b float32
)
a = 10
b = 10.1
fmt.Println(a,b)


//定义多个常量
const(
   //必须初始化常量的值 因为不可以改变
   //也可以不写类型 自动推导
   c int = 20
   d float32 = 20.1
)
fmt.Println(c,d)

iota枚举

//iota 是常量的枚举计数生成器
const (
   a = iota
   b = iota
   c = iota
)
fmt.Println(a,b,c)
//iota在同一行的时候是相同的值
const(
   i = iota
   d,e,f = iota,iota,iota
)
fmt.Printf("i = %d,d= %d,e = %d,f = %d\n",i,d,e,f)

//可以只写一个iota
const (
   a1 = iota
   b1
   c1
)
fmt.Println(a1,b1,c1)

//iota遇到const值为0
const s = iota
fmt.Printf("s = %d\n",s)

数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rwFBSPXF-1587565143439)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200408181330901.png)]

bool布尔值
/*
定义一个布尔值
默认的初始化的是false
可以自动推导 使用 :=
 */
var a bool
fmt.Println(a)
a = true
fmt.Println(a)
var b = true
fmt.Println(b)
c := false
fmt.Println(c)
int整形

var a int = 值

a = 赋值

a := 值

float浮点型
//定义一个浮点型的数据
var a float32
a = 10.1
fmt.Println(a)

//自动推导
b := 3.14
fmt.Printf("b type is %T\n",b)
byte字节
//字符 byte
//printf 是数据的格式化 %d 是格式化成数字  %c 是格式化成字母
var ch byte
ch = 97
fmt.Printf("%c,%d\n",ch,ch)

//大小写的转换 \n是转义字符

//这是小写的转换成大写的
fmt.Printf("%c\n",'a'-32)
fmt.Printf("%c",'A'+32)
String 字符串
//声明一个字符串类型
var a string
a = "like"
fmt.Println("a=", a)

//自动推导类型
b := "mikes"
fmt.Println("b = ", b)

//string 字符串有一个操作就是len 可以获取字符串的长度
fmt.Println("b 的字符串的长度为",len(b))

string和byte的区别

/*
string 和 byte
string输出就是一个单独的字符串
byte字符的话就是自动转换成数字
 */
var str string
str = "a"
fmt.Println("str = ",str)

var by byte
by = 'a'
fmt.Println("a = ",by)
Complex复数
//定义一个复数
   var t complex128
   t = 1 + 2i
   //分为实部和虚部
   fmt.Println("t = ",t)

   //自动推导过程
   t1 := 2+2i
fmt.Println(real(t1),imag(t1))

   //分别拿出来函数的实部和虚部
   fmt.Println(real(t),imag(t))

格式化输出的类型

a := 10
b := "str"
c := 'a'
d := 3.14
fmt.Printf("%T,%T,%T,%T \n",a,b,c,d)

//格式化输出的类型
//%d 整形
//%s 字符串
//%c 字符
//%f 浮点型
//%T 类型
//%v 万能的
fmt.Printf("%d,%s,%c,%f\n",a,b,c,d)

变量的输入

(scan scanf)

var a int
fmt.Printf("请输入变量值a")
//阻塞等待用户的输入
fmt.Scanf("%d",&a)
//fmt.Scan(&a)
fmt.Println("a = ",a)

类型的转换

//bool布尔类型是不兼容类型不能进行转换
var a bool
a = false
fmt.Printf("%t",a)

var b byte
b = 'a'
var c int
c = int(b)//转换类型
fmt.Print(c)

流程控制语句

If语句

if语句 if-else if-else

//if语句
a := "王丽坤"
if a=="王丽坤"{
   fmt.Println("这个人是王丽坤")
}

//支持一个初始化语句和判断条件在同一行 使用分号隔开
if b:="赵丽颖";b=="王丽坤"{
   fmt.Println("这个人是赵丽颖")
}else{
   fmt.Println("这个人是王丽坤")
}

switch语句

var num int
fmt.Println("请输入楼层号")
fmt.Scan(&num)
switch num {
case 1:
   fmt.Println("这是第一层楼")
   //break 保留了break关键字
   fallthrough //这是匹配工程之后无条件的执行
case 2:
   fmt.Println("这是第二层楼")
   fallthrough
case 3:
   fmt.Println("这是第三层楼")
   fallthrough
case 4:
   fmt.Println("这是第四层楼")
   fallthrough
case 5:
   fmt.Println("这是第五层楼")
   fallthrough
default:
   fmt.Println("xxxxxx")
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bl53CzPf-1587565143441)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200408223528673.png)]

For循环(range)

sum := 0
for i:=1;i<=100;i++{
   sum = sum+i
}
fmt.Println(sum)

str := "hello"
for i:=0;i<len(str);i++{
   fmt.Printf("str[%d] = %c\n",i,str[i])
}

for i,data:=range str{
   fmt.Printf("str[%d] = %c\n",i,data)
}

for i := range str{
   fmt.Printf("str[%d] = %c\n",i,str[i])
}

死循环

package main
import "fmt"
import "time"
func main(){

   i := 0
   for{
      i++
      time.Sleep(time.Second)
      if i==5{
         break //跳出循环
         continue //结束本次循环
      }
      fmt.Println(i)
   }
}

GoTo

fmt.Println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
fmt.Println("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
goto End  //五条件的跳转 End是自己取得名字
fmt.Println("cccccccccccccccccccccccccccccccccccccccccc")
End:
   fmt.Println("dddddddddddddddddddddddddddddddddddddd")

函数

//定义一个不定参数
func Myfunc(args ...int){
   //使用迭代带引出来
   for i,data:=range args{
      fmt.Printf("args[%d] =%d \n",i,data)
   }
   //for循环
   for i:=0;i<len(args);i++{
      fmt.Printf("args[%d] =%d \n",i,args[i])
   }

}
func Myfunc1(a int,args ...int){
   //使用迭代带引出来
   for i,data:=range args{
      fmt.Printf("args[%d] =%d \n",i,data)
   }
   //for循环
   for i:=0;i<len(args);i++{
      fmt.Printf("args[%d] =%d \n",i,args[i])
   }

}

 func main(){
   Myfunc(12,1,3,4)
    Myfunc1(12,1,3,4)
 }
//定义一个不定参数的函数
func myfunc(temp...int){
   //使用迭代的方式输出
   for i,data:=range temp{
      fmt.Printf("temp[%d]=%d\n",i,data)
   }
   //传递到另一个函数中
   //myfunc1(temp...)  //全部参数传给myfunc1的函数
   //myfunc1(temp[:2]...) //传递前两个参数
   myfunc1(temp[2:]...) //传递后两个参数
}

//需要传递的函数
func myfunc1(args...int){
   for i,data:=range args{
      fmt.Printf("args[%d]=%d\n",i,data)
   }
}

func main(){
   myfunc(1,2,3,4)
}
package main

import "fmt"

//定义一个有参数有返回值的函数
func MaxAndMin(a,b int)(max,min int){
   if a>b {
      max = a
      min = b
   }else {
      max = b
      min = a
   }
   return max,min
}


func main(){
   a,b := MaxAndMin(1,3)
   fmt.Printf("a = %d,b = %d\n",a,b)
}
func MyFunc01() (result int) {
   result = 10
   return result
}

//无参多个返回值的函数
func MyFunc02() (a, b, c int) {
   a = 1
   b = 2
   c = 3
   return a, b, c
}

func main() {
   var a int
   a = MyFunc()
   fmt.Println("a=", a)

   b := MyFunc01()
   fmt.Println("b=", b)

   d, e, f := MyFunc02()
   fmt.Printf("d =%d,e=%d,f = %d\n", d, e, f)

}

递归函数

//递归函数
func myfunc(a int){
   if a ==1{
      fmt.Println("a = ",a)
      return
   }
   myfunc(a-1)
   fmt.Println(a)
}

func main(){
   myfunc(3)
}
func Funcsum(a int) int {
   for i := 1; i < 100; i++ {
      a += i
   }
   return a
}

//使用递归的方法实现累加
func funcsum1(b int) int {
   if b == 1 {
      return 1
   }
   return b + funcsum1(b-1)
}

func main() {
   var sum int
   sum = Funcsum(100)
   fmt.Println(sum)

   var sum1 int
   sum1 = funcsum1(100)
   fmt.Println(sum1)

}
//定义一个加法的方法函数
func Add(a,b int)(res int){
   res = a+b
   return res
}

//定义一个减法的法则函数
func JanFa(a,b int)(res int){
   res = a-b
   return res
}
//给函数类型起一个名字 必须是相同的参数还有相同的返回值的函数才能一起
type Fuc func(int,int) int

func main(){
   var result Fuc
   result = Add
   res := result(1,2)
   fmt.Println("a+b=",res)

   result = JanFa
   res1:=result(10,6)
   fmt.Println(res1)
}

指针

//定义一个变量a 并且赋值为10  然后打印变量a的地址值
var a int = 10
fmt.Println(a)//打印a的内存值
fmt.Println(&a) //打印a的地址值

//定义一个变量p来接收a的地址值
var p *int
p = &a
fmt.Println(p)

*p = 999
fmt.Printf("p = %p,a = %p\n",*p,a)
值传递
func swap(a,b int){
   a,b = b,a
   fmt.Println(a,b)
}
//值传递
func main(){
   a,b := 10,20
   swap(a,b)
   fmt.Println(a,b)
地址传递
func swap(a,b *int){
   *a,*b = *b,*a
}

func main(){
   a,b := 10,20
   swap(&a,&b)//地址传递
   fmt.Println(a,b)
}

Array

func main(){
   var a [10]int
   //for i:=0;i<len(a);i++  {
   // a[i] = i+1
   // fmt.Println(i,a[i])
   //}

   for i,data:= range a{
      fmt.Printf("a[%d] = %d\n",i,data+(i+1))
   }
}
数组定义
func main(){
   var a [5]int = [5]int{1,2,3,4,5}
   fmt.Println(a)

   b := [5]int{1,2,3,4,5}
   fmt.Println(b)

   c:= [5]int{1,2,3}
   fmt.Println(c)

   d := [5]int{1:10,2:10}
   fmt.Println(d)
   
import(
   "fmt"
   "math/rand"
   "time"
)


func main(){
   //产生一个随机数
   var arr [10]int
   rand.Seed(time.Now().UnixNano())
   for i:=0;i<len(arr);i++{
      arr[i] = rand.Intn(100)
   }
   fmt.Println(arr)
   n:=len(arr)
   for i:=0;i<n-1;i++{
      for j:=0;j<n-1-i;j++{
         if arr[j]>arr[j+1] {
            arr[j],arr[j+1] = arr[j+1],arr[j]
         }
      }
   }
   fmt.Println(arr)
}
切片
    //创建一个切片
   s :=[]int{1,2,3,4,5}
   fmt.Println(s)
   fmt.Println(len(s))//切片的长度
   fmt.Println(cap(s))//切片的容量

   s1 := make([]int,5,9)
 fmt.Println(len(s1))//切片的长度
 fmt.Println(cap(s1))//切片的容量
 s3:=append(s, 111)
 fmt.Println(s3)
}
MAP
//定义一个map函数
mp := map[int]string {1:"js",2:"java",3:"go"}
mp[1] = "java1"
fmt.Println(mp)
//map的遍历

for key,value:=range mp{
   fmt.Println(key)
   fmt.Println(value)
}

//如何判断一个key值是否存在

value,ok :=mp[1]
if ok==true{
   fmt.Println(value)
}else{
   fmt.Println("不存在")
}
//初始化一个map函数
a :=map[int] string {1:"java",2:"js"}
fmt.Println(a)
//键值是唯一的

b := make(map[int]string,10)
b[0]= "js"
b[1]= "go"
b[2]= "java"
fmt.Println(len(b))
fmt.Println(b)

删除

func main() {
   //定义一个map函数
   mp := map[int]string{1: "js", 2: "java", 3: "go"}
   delete(mp,1)
   fmt.Println(mp)
}

继承(匿名字段)

//结构体
type Person struct {
   name string
   sex  byte
   age  int
}

//继承人类的结构体
type Student struct {
   Person //只有类型 没有名字 继承人类 匿名字段
   id   int
   addr string
}

func main() {
   //初始化结构体
   var s1 Student = Student{Person{"lei", 'a', 18}, 1, "bj"}
   fmt.Println(s1)

   //使用自动推导类型初始化结构体 没有被赋值的都转换为0
   s2 := Student{id: 1, addr: "bj"}
   fmt.Println(s2)

   s3 :=Student{Person:Person{name:"leilei"},id:2}
   fmt.Println(s3)
   fmt.Printf("s3 = %+v",s3)

}

对成员的操作

s3 :=Student{Person:Person{name:"leilei"},id:2}
//对成员的操作
s3.sex= 's'
s3.age = 99
fmt.Println(s3)
fmt.Printf("s3 = %+v",s3)
方法
//传统的方法
func Add(a,b int) int{
       return a+b
    }

    //面向对象的方法
    //先是给类型变化一个名称
    type long int
    func (a long) Add1(b long) long{
       return a+b
    }

    func main(){
       res := Add(2,3)
       fmt.Println(res)

       var r long
       r = 2
       res1:=r.Add1(2)
       fmt.Println(res1)

结构体的

值传递(方法)

引用传递(方法)

package main

import "fmt"

//定义一个结构体
type Person struct{
   id int
   name string
   age int
}

//定义一个方法 值传递
func (a Person) SetVaule(id int,name string,age int){
   a.id = id
   a.name= name
   a.age = age
   fmt.Println(id,name,age)
}
//定义一个方法 引用传递
func (a *Person) SetVaule1(id int,name string,age int){
   a.id = id
   a.name= name
   a.age = age
   fmt.Println(id,name,age)
}
func main(){
   var p Person = Person{1,"lei",18}
   fmt.Println(p)

   //值传递的调用方式
   p.SetVaule(2,"lei1",20)
   fmt.Println(p)

   //引用传递的调用方式
   (&p).SetVaule1(2,"lei1",20)
   fmt.Println(p)

接口

package main

import "fmt"
//定义一个接口
type Hurmaner interface{
   sayhi()
}
//有一个结构体
type Person struct{
   name string
   age int
   sex byte
}
type Student struct{
   Person
   id int
   addr string
}
type Teather struct{
   tid int
}

func (temp *Person) sayhi(){
      fmt.Println(temp)
}

func (temp *Student) sayhi(){
   fmt.Println(temp)
}
func (temp *Teather) sayhi(){
   fmt.Println(temp)
}

func Whosayhi(i Hurmaner){
   i.sayhi()
}

func main(){
   //1
   var i Hurmaner
   p :=&Person{"lei",18,'n'}
   i = p
   i.sayhi()

   p1 := &Student{Person{"lei",18,'n'},18,"bj"}
   i = p1
   i.sayhi()

   p2 := &Teather{12}
   i = p2
   i.sayhi()
   //2
   s := make([]Hurmaner,3)
   s[0] = p
   s[1] = p1
   s[2] = p2
   for _,k:=range s{
      k.sayhi()
   }
   //3
   Whosayhi(p)
   Whosayhi(p1)
   Whosayhi(p2)

}

1.9+1.8+1.6+1 =6.3

0.7+1.8+1.5+0.6 = 4.6

0.7+0.9+0.8+0.7=3.1

异常处理

error
package main

import(
   "fmt"
   "errors"
)

func Myfuc (a,b int)(res int,err error){
   err = nil
   if b==0 {
      err = errors.New("分母不能为0")
   }else{
      res = a/b
   }
   return
}


func main(){
    r,e:= Myfuc(10,2)
   if e!=nil {
      fmt.Println(e)
   }else{
      fmt.Println(r)
   }
}
panic
package main

import "fmt"

func text() {
   fmt.Println("aaaaaaaaaa")
}
func text1() {
   //fmt.Println("bbbbbbbbbbb")
   panic("这是一个致命的错误")
}
func text2() {
   fmt.Println("cccccccccccc")
}

func main() {
   text()
   text1()
   text2()
}
func text() {
   fmt.Println("aaaaaaaaaa")
}
func text1(a int) {
   //数组越界 定义一个数组
   var arr [10]int//errnot enough arguments in call to text1
   arr[a] = 111
}
func text2() {
   fmt.Println("cccccccccccc")
}

func main() {
   text()
   text1()
   text2()
}
recover
package main

import "fmt"

func text() {
   fmt.Println("aaaaaaaaaa")
}
func text1(a int) {

   defer func(){
      if err:= recover();err != nil {
         fmt.Println(err)
      }
   }()
   //数组越界 定义一个数组
   var arr [10]int//errnot enough arguments in call to text1
   arr[a] = 111
}
func text2() {
   fmt.Println("cccccccccccc")
}

func main() {
   text()
   text1(1)
   text2()
}

String操作

//使用container判断单词是不是在这个字符串中存在
str := "hello world"
fmt.Println(strings.Contains(str,"hello")) //true
fmt.Println(strings.Contains(str,"this")) //false

//使用join实现字符串的组合
/*str1:=make([]string,3,3)
str1[0] = "hello"
str1[1] = "world"
str1[2] = "go"*/
str1:= []string{"hello world go"}
fmt.Println(strings.Join(str1,","))

//使用index知道单词所在的索引
fmt.Println(strings.Index(str,"world"))

//repeat平铺个数
str2:="go"
fmt.Println(strings.Repeat(str2,3))

//使用split实现字符串的拆分
fmt.Println(strings.Split(str,"l"))

//使用trim去掉两头的空格
str2 = "      are you ok     "
fmt.Println(strings.Trim(str2," "))

//去掉空格 吧元素放进切片中
fmt.Println(strings.Fields(str2))
for i,data:= range str2{
   fmt.Println(i,data)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N29kw2AT-1587565143444)(C:\Users\Administrator\Desktop\后端相关\pic\微信截图_20200406085802.png)]

结构体转化成json

package main
import(
   "fmt"
   "encoding/json"
)
type Itcast struct{
   Company string
   Subjects []string//切片类型
   Isok bool
   Price float64
}

func main(){
   s:= Itcast{"bj",[]string{"Go","Java","Js"},true,33.33}
   jsonres,err:=json.Marshal(s)
   if err!=nil{
      fmt.Println(err)
      return
   }
   fmt.Println(string(jsonres))
}
Company string `json:"company"`
Subjects []string  `json:"subjects"`
Isok bool  `json:",string"`
Price float64 `json:",string"` //二次编码  
import(
   "fmt"
   "encoding/json"
)
func main(){
   //创建一个map对象
   m:=make(map[string]interface{},4)
   m["company"] = "itecast"
   m["subject"] = []string{"Go","Java","Js"}
   m["isok"] = true
   m["price"] =66.6

   //res,err := json.Marshal(m)
   res,err:= json.MarshalIndent(m,"","    ")
   if err!=nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(res))
}
package main

import(
   "fmt"
   "encoding/json"
)
type Itcast struct{
   Company string `json:"company"`
   Subjects []string  `json:"subjects"`
   Isok bool  `json:"isok"`
   Price float64 `json:"price"` //二次编码
}
func main(){
   jsonbuf:=`{
      "company": "itecast",
         "isok": true,
         "price": 66.6,
         "subject": [
      "Go",
         "Java",
         "Js"
      ]
   }`
   var a Itcast
   err:=json.Unmarshal([]byte(jsonbuf),&a)
   if err!= nil{
      fmt.Println(err)
      return
   }
   fmt.Println(a)
}

并发

package main

import(
   "fmt"
   "sync"
)
var wg sync.WaitGroup
func Hello(){
   fmt.Println("hello 王丽坤")
   wg.Done()//完成之后的通知
}
func main(){
   wg.Add(1)//计数牌+1
   go Hello() //开启协程
   //主协程
   fmt.Println("hello world")
   wg.Wait() //阻塞 等待

}
package main

import(
   "fmt"
   "time"
)

func main(){
   //主协成退出了 别的也跟着退出了
   
   go func() {
      i:=0
      for{
         i++
         fmt.Println("func=",i)
         time.Sleep(time.Second)
      }
   }()
   i:=0
   for{
      i++
      fmt.Println(i)
      time.Sleep(time.Second)
      if i==5 {
         break
      }
   }
}

gosched

当主协程已经完了但是还没有开始协程 runtime.Gosched() 可以使用gosched函数让步

runtime.goexit()是终止协程

runtime.GOMAXPROCS()可以设置以多少核运算

return是终止本次的函数

import (
   "fmt"
   //"runtime"
   "runtime"
)

func main(){
   go func() {
      for i:=0;i<5;i++{
         fmt.Println("bbbbbbbbb")
      }
   }()


   for i:=0;i<5;i++{
      runtime.Gosched()
      fmt.Println("aaaaaaa")
   }
}

channel缓存

//定义一个管道
var n = make(chan int)

package main

import (
   "fmt"
   "time"
)

//打印机
func Print(str string) {
   for _, data := range str {
      fmt.Printf("%c",data)
      time.Sleep(time.Second)
   }
   fmt.Printf("\n")
}

//定义一个管道
var n = make(chan int)

func Person1() {
   Print("hello")
   n <- 888 //输出
}

func Person2() {
   <-n //接收的
   Print("world")
}

func main() {
   go Person1()
   go Person2()

   //主协程
   for {
      i := 0
      i++
      if i == 20 {
         break
      }
   }

}

TCP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uki3VXTa-1587565143446)(C:\Users\Administrator\Desktop\后端相关\pic\Tcp.png)]

Mysql数据库

//声明一个全局的db 创建数据库的连接池
var db *sql.DB

数据库中的所有增删改查都是通过db连接池操作的

打开数据库

db, err = sql.Open("mysql", dsn)
db, err = sql.Open("mysql", dsn)
if err != nil {
   return
}
//验证用户名和密码  ping一下数据库
err = db.Ping()
if err != nil {
   return
}

查询数据

单条

row := db.QueryRow(sqlstr, id)

多条

rows,err:=db.Query(sqlstr,id)

多条需要关闭 rows.close() 单条不用

增删改查都是通过

ret,err:=db.Exec(insertsql)
//批量的插入多条数据
func prepareInsert(){
   //sql语句
   insertsql:=`insert into text(text_name,text_age) values (?,?)`
   //预处理吧sql保存起来
   stmt,err:=db.Prepare(insertsql)
   if err!=nil {
      fmt.Printf("stmt err is %v\n",err)
      return
   }
   defer stmt.Close()
   //事后拿stmt做处理
   s:=make(map[string]int,5)
   s["张强"] = 18
   s["小明"] = 89
   s["小李"] = 23
   for key,value:=range s{
      stmt.Exec(key,value)
   }
}
//设置最大的连接数
db.SetMaxOpenConns(10)
//设置最大的空闲连接数
db.SetMaxIdleConns(5)

go mod init 项目名字

开启事务 实现过个事务操作

//定义一个管道
var n = make(chan int)

func Person1() {
Print(“hello”)
n <- 888 //输出
}

func Person2() {
<-n //接收的
Print(“world”)
}

func main() {
go Person1()
go Person2()

//主协程
for {
i := 0
i++
if i == 20 {
break
}
}

}


## TCP

[外链图片转存中...(img-Uki3VXTa-1587565143446)]

## Mysql数据库

//声明一个全局的db 创建数据库的连接池
var db *sql.DB


数据库中的所有增删改查都是通过db连接池操作的

打开数据库

db, err = sql.Open(“mysql”, dsn)


db, err = sql.Open(“mysql”, dsn)
if err != nil {
return
}
//验证用户名和密码 ping一下数据库
err = db.Ping()
if err != nil {
return
}


查询数据

单条

row := db.QueryRow(sqlstr, id)


多条

rows,err:=db.Query(sqlstr,id)


多条需要关闭 rows.close() 单条不用

增删改查都是通过

ret,err:=db.Exec(insertsql)


//批量的插入多条数据
func prepareInsert(){
//sql语句
insertsql:=insert into text(text_name,text_age) values (?,?)
//预处理吧sql保存起来
stmt,err:=db.Prepare(insertsql)
if err!=nil {
fmt.Printf(“stmt err is %v\n”,err)
return
}
defer stmt.Close()
//事后拿stmt做处理
s:=make(map[string]int,5)
s[“张强”] = 18
s[“小明”] = 89
s[“小李”] = 23
for key,value:=range s{
stmt.Exec(key,value)
}
}


//设置最大的连接数
db.SetMaxOpenConns(10)
//设置最大的空闲连接数
db.SetMaxIdleConns(5)


## go mod init 项目名字

开启事务 实现过个事务操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IePanfAs-1587565143448)(C:\Users\Administrator\Desktop\后端相关\pic\数据库开启事务.png)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值