当前位置: 首页 > news >正文

wordpress 建站视频网站多服务器建设

wordpress 建站视频,网站多服务器建设,株洲网站设计外包运营,为什么网站建设需要每年续费type关键字的用法 定义结构体定义接口定义类型别名类型定义类型判断 别名实际上是为了更好地理解代码/ 这里要分点进行记录 使用传值的例子#xff0c;当两个类型不一样需要进行类型转换 type Myint int // 自定义类型#xff0c;基于已有的类型自定义一个类型type Myin…type关键字的用法 定义结构体定义接口定义类型别名类型定义类型判断 别名实际上是为了更好地理解代码/ 这里要分点进行记录  使用传值的例子当两个类型不一样需要进行类型转换 type Myint int // 自定义类型基于已有的类型自定义一个类型type Myint int // 在编译的时候类型别名会被直接替换为int 上面两种方式定义的int是不同的因为使用等于号是类型别名不使用等于号的是重新定义了一个类型。 type Myint int  如果我们即想使用int类型又想让这种类型的变量有自己的方法我们可以使用type自定义一种类型这其实也算是一种结构体我们可以为这个结构体创建一个方法我们就可以进行调用这个方法。 type Myintint 这个语句就是单独地给int变量起一个别名其他用法和int一模一样。 结构体的定义和初始化 在go语言中没有面向对象的概念但是可以使用面向对象的思想 type Person struct {name stringage intaddress stringheight float32 }// 在进行初始化的时候我们有两种方式 p1 : Peason{xiaomin, 14, 佳, 1.8}p2 : Person{name:xiaomin,age:14, } 匿名结构体  匿名函数 只能使用一次。 address : struct {province stringcity stringaddress string }{北京市,通州区,xxx, } 结构体嵌套 有两种嵌套方式 type Person struct {name stringage int }type student struct {p Personscore int }type student struct {Personscore int } 匿名定义中有一些问题如果匿名结构体中有name但是在外边的结构体中也有name那么我们会发现外部的结构体的name的优先级大于匿名结构体中的优先级。 结构体定义方法 接收器有两种形态一种是值传递一种是指针传递当我们需要进行修改结构体中的数值或者传递的结构体的容量很大时我们需要进行指针传递。 如果接收器是指针类型但是我们是值类型我们可以进行调用函数的同理另一种情况也是可以的。 指针 go语言中限制了指针的运算在C语言中我们可以使用指针进行加减运算  指针的初始化 指针是需要进行初始化的 在初始化的时候有两个关键字make new   map channel  slice  初始化推荐使用make方法 指针初始化推荐使用new函数指针需要进行初始化否则会出现nil pointer map必须初始化否则会出现panic  nil在go中的细节 不同类型的数据的零值不一样 bool false numbers 0 string pointer nil slice nil map nil channel  interface function nil struct 的默认值不是nil默认值是具体字段的默认值 slice的底层介绍等会看一看 map也分为两种 nil map 和 empty map 在大部分场景下nil map 和 empty map一样但是当我们给nil map 进行赋值的时候会进行panic 接口 什么是鸭子类型 方法。动词具备某些方法go语言中强调的是动作 鸭子类型强调的是外部行为而不是内部的结构 如何定义一个接口 type Duck interface{// 方法的申请Gaga()Walk()Swiming() }type pskDuck struct {legs int }func (pd *pskDuck) Gaga() {fmt.Println(this is walking...) }func main() {var d Duck pskDuck{}d.Gaga() } 多接口的实现  不是很懂 如果有两个接口中的函数出现重复说明我们可以将函数进行复用我们可以实现接口进行解耦。 type MyWriter interface{Write(string) error }type MyCloser interface{Close() error }type WriteClose struct {MyWriter // interface 也是一种类型 }func (wc *WriteClose) Writer(s string) error {fmt.Println(this is writer)return nil }func (wc *WriteClose) Close() error {fmt.Println(this is closer)return nil } 在go语言中多接口的实现是通过组合接口来实现的go不支持多重继承但是可以让一个类型实现多个接口具体来说只要一个类型实现了某些方法他就自动实现了相应的接口。通过这种方式go语言允许一个类型轻松实现多个接口促进了灵活的设计和代码复用。 通过interface解决动态类型传参 我们在实现一些 使用断言转换类型   但是还是没有解决问题 使用switch语句断言处理分支语句可以用到 a.(type) 可以判断是什么类型  但是更通用的写法是泛型。 string.Split 接口嵌套 接口遇到了slice的常见错误 单元测试 Go的并发编程 go的并发编程初体验 在phpjavapython等语言中都是有多线程编程多进程编程多线程和多进程存在的问题主要是耗费内存。在进行进程切换和线程切换的时候CPU会消耗一些资源。因此在go语言中我们推出了协程用户级线程绿程轻量级线程。 在协程中内存占用小2k切换快在go语言的协程中go余元诞生之后就只有协程可以使用——goroutine非常方便。我们可以在程序中使用协程创建出10万以上的协程但是线程在程序中只能创建出100多个。下面我们来看一看协程的代码 func asyncPrint() {fmt.Println(加油旭杏) }// 主协程 func main() {go asyncPrint() } 上述代码是单个协程的调用如果我们想使用多协程进行调用我们可以使用循环来创建出多个协程。在创建协程的时候我们有两种方式可以进行创建一种是直接调用函数一种是匿名函数。代码如下 func Print() {fmt.Println(加油旭杏) }// 匿名结构体 func main() {go func() {for {fmt.Println(加油旭杏)}}time.Sleep(10 * time.Second) } 这里为了使程序不退出我们在主协程中添加了睡眠时间但是这种方式是非常挫的在下面我们将会学习另一种等待协程的方法。 有一个问题在C中如果有多个线程去执行一个加法运算再执行一个减法运算会出现错误的我们需要使用锁来进行让加减操作变成原子操作。如果操作简单我们也可以使用原子变量来进行操作。 我们来看一看下面的代码 for i : 0; i 100; i {go func() {fmt.Println(i)}() } 第一个原因是我们使用匿名函数也就是闭包只能使用一次第二个原因是我们使用了for循环在for循环中每一个变量会被重新使用所以我们在调用加操作之前的变量和调用加操作之后的变量不是同一个变量因为这个不是原子操作也会CPU的调度有关。 go的gmp调度原理 这个gmp调度是分层的我们先来看一看两层结构一个是协程一个是线程在Go语言中我们会将协程放入到线程去执行 一张图   g  gorounte  m     p 我们在协程调度的时候我们需要将 通过waitgroup来等待协程 子gorounte如何通知到主的gorount自己结束了主的gorounte如何知道子的gorounte已经结束了 之前我们使用的例子是通过设置时间长度但是我们不知道具体需要多少时间所以这个代码是比较挫的现在我们来认识一下WaitGroup。我们可以通过WaitGroup来将协程加入如果我们事先知道协程的总数可以直接在循环之前进行添加如果我们不知道协程的总数我们可以在循环的时候进行添加每循环一次就添加一次在添加之后我们需要将其进行done类似于锁的机制一样否则会造成死锁。因此我们需要知道WaitGroup的add和done是需要配套使用的。最后我们需要进行wait方式进行等待。代码如下 var wg sync.WaitGroup// 我们需要监控多少个gotountine执行结束 wg.Add(100) for i : 0; i 100; i {go func(i int) {fmt.Println(i)wg.Done(); // Done和Add要成对出现}() }// 等待 wg.Wait() waitgroup主要用于gorountine的执行等待add方法主要和done方法配套最后要使用Wait方法进行等待否则会出现死锁。 通过mutex和atomic完成全局变量的原子操作 当我们需要进行共享资源的访问时我们需要进行锁来对于资源竞争的保证。下面我们来看一看代码 func add() {defer wg.Done()for i : 0; i 10000; i {lock.Lock()total 1 // 这里会有竞争lock.Unlock()} }func sub() {defer wg.Done()for i : 0; i 10000; i {lock.Lock()total - 1 // 这里会有竞争lock.Unlock()} } 当我们单独执行add函数或者单独执行sub函数结果都是正确但是当我们两个一起执行时结果是错的在Linux中我们也出现了这种情况因为a 1不是原子操作当CPU进行执行这段代码时有可能中途退出我们需要将这段代码进行保护起来不要让他单独执行。在go语言中的锁是一个结构体锁可以进行复制但是复制过后锁就失去了自身的效果。下面是将加减操作改为原子操作代码如下 func add() {defer wg.Done()for i : 0; i 10000; i {atomic.AddInt32(total, 1)} }func sub() {defer wg.Done()for i : 0; i 10000; i {atomic.AddInt32(total, -1)} } RWMutex 读写锁 锁本质上就将并行的代码串行化使用lock会影响性能。即使是设计锁那么也应该保持并行。 我们有两组协程其中一组负责写数据另一组负责读数据web系统中绝大部分场景都是读多写少。虽然有多个gorounte但是仔细分析我们会发现读是可以进行并发读和写应该进行串行。我们在读的时候不能写在写的时候不能读。 这里我们就出现了读写锁m我们在进行读写锁的时候我们需要将写操作的时候添加写锁: 写锁会防止别的写锁获取和读锁获取使用WaitGroup读锁不会阻止别人的锁写锁会阻止别人的锁。 for i : 0; i 5; i {go func() {defer wg.Done()for {rwlock.RLock() // 加读锁读锁不会阻止别人的读// TODOrwlock.RUnlock()}} } 使用channel进行gorounte之间的通信 channel通道 在Go语言中不要通过共享内存进行通信而是要通过通信来实现内存共享 在C中如何实现进程之间的通信就是使用一个全局变量两个线程都可以看到的来实现通信在其他语言中的多线程编程的时候两个gorountine之间通信最常用的方式是channel再加上语法糖让channel更加简单。 channel初始化值为0放值进去会阻塞。 func main() {var msg chan string // 定义一个通道msg make(chan string, 1)msg - 加油data : - msgfmt.Println(data) } 静态语言中使用channel我们需要指明通道中的类型是什么注意箭头的指向如果定义的通道在箭头的左边则是将数据放入到通道中如果定义的通道在箭头的右边表示从通道中取数据。 channel有缓冲和无缓冲 var msg chan stringmsg make(chan string, 0) // channel的初始值如果为0的话你放值进去会进行阻塞go func(msg chan string) {// go语言中有一种 happen-before机制可以保证线程在channel中有值才会进行data : - msgfmt.Println(data) }(msg)msg - 加油旭杏 // 放值到channel中 time.Sleep(time.Second * 10) 无缓冲区channel适用于 通知B要第一时间知道A是否完成 有缓冲区channel适用于消费者和生产者之间的通信  go中channel的应用场景 消息传递消息过滤信号广播事件订阅和广播任务分发结果汇总并发控制同步和异步 在默认情况下channel是双向的但是我们经常使用channel作为参数进行传递希望对方是单向使用的。 双向channel可以赋值给单向channel但是单向channel不能赋值给双向channel代码如下 var ch1 chan int var ch2 chan- float64 // 单向channel只能写入数据 var ch3 -chan int // 只能读取数据 我们需要进行通信就需要进行 通过channel实现交叉打印 我们需要使用channel进行打印我们使用channel去进行通知好像信号量就是我们先打印数字然后唤醒打印字符的在去打印字符打印完字符再去唤醒打印数字的如此交替执行。 监控gorounte的执行 在go语言中select类似于switch case 语句但是select的功能和我们操作Linux里面提供的io的selectpollepoll不一样select主要作用于多个channel。 现在有一个需求我们现在有两个gorounte正在执行但是我的主的gorounte中当某一个执行完成之后这个时候我们会立马知道
http://www.hkea.cn/news/14347373/

相关文章:

  • 从化市网站建设互联网门户是什么意思
  • 教育类网站如何做国家企业信用公示系统官方网站
  • 关于网站建设实验报告wordpress如何发表新文章
  • 公司网站建设找哪家wordpress 敏感字
  • 中山网站建设制作 .超凡科技wordpress jquery插件
  • 做那个免费视频网站营销型网站公司名称
  • 怎样自己做刷赞网站wordpress调用oss
  • 南宁住房和城乡建设部网站成都中方互动科技有限公司
  • 上线了建站价格为什么做电商网站
  • 北京网站定制制作怎么做建设网站
  • 做网站,图片显示不出来新版在线天堂网
  • 一个人能建设一个公司网站吗贵州省住房和城乡建设厅电话
  • 空间租用 网站开发北京建设集团网站
  • 三三网是什么网站dede中英文网站切换
  • 建设网站有什么法律么网站开发设计流程图
  • sql数据库添加网站县科协微网站建设
  • 大型电子商务系统网站建设百度运营推广
  • 仿门户网站多功能js相册画廊源码包头seo推广哪家专业
  • 杭州下城区建设局网站贵州专业网站建设公司哪家好
  • 服装设计师常用网站汶上公司网站建设
  • 网站怎么做图片转换长尾词优化外包
  • 网站建设吉金手指专业13网站为什么吸引人
  • 广西建设培训中心网站免费正规大数据查询平台
  • 中土南方建设有限公司网站建立家族修仙
  • 外贸网站推广建站网页游戏开服表大全
  • asp.net 实现 网站的开关如何制作视频教程
  • wordpress 短码按钮保定seo排名公司
  • 微信网站案例电商网站设计图
  • 海外营销推广 平台南通网站seo报价
  • 滕州市做网站网站icp备案号怎么查