• go语言细节


    1 数组与字符串为值类型,切片、映射、通道为值类型,赋值需注意。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8     //数组
     9     a1 := [3]int{1, 2, 3}
    10     a2 := a1
    11     a2[0] = 2 
    12     fmt.Println(a1) //print: 1 2 3
    13     fmt.Println(a2) //print: 2 2 3
    14     // 字符串
    15     s1 := "123"
    16     s2 := s1
    17     s2 = "223"
    18     fmt.Println(s1) //print 123
    19     fmt.Println(s2) //print 223
    20     // 切片
    21     slice1 := []int{1, 2, 3}
    22     slice2 := slice1
    23     slice2[0] = 2 
    24     fmt.Println(slice1) //print 2 2 3
    25     fmt.Println(slice2) //print 2 2 3
    26     // map
    27     m1 := make(map[int]string)
    28     m1[1] = "1" 
    29     m2 := m1
    30     m2[1] = "2" 
    31     fmt.Println(m1) //print 1:2
    32     fmt.Println(m2) //print 1:2
    33     // chan
    34     c1 := make(chan bool)
    35     c2 := c1
    36     go func() {
    37         v := <-c2
    38         fmt.Println(v) //print true
    39     }() 
    40     c1 <- true
    41 }
    View Code

    2 byte为uint8类型,string不是[]byte或[]rune类型。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8     s := "hello world"
     9     var i interface{} = s 
    10 
    11     switch i.(type) {
    12     case []byte:
    13         fmt.Println("string type is []byte")
    14     case []rune:
    15         fmt.Println("string type is []rune")
    16     case []int8:
    17         fmt.Println("string type is []int8")
    18     }   
    19 
    20     slice := []byte{1, 2}
    21     i = slice
    22     switch i.(type) {
    23     case []uint8:
    24         fmt.Println("byte is uint8")//print 
    25     }   
    26 }
    View Code

    3 接口为类型和值的二元组,nil类型为空且值为空。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func trueNil() interface{} {
     8     return nil 
     9 }
    10 
    11 func falseNil() interface{} {
    12     var ret *int = nil // 此nil带有类型
    13     return ret 
    14 }
    15 func main() {
    16     if trueNil() == nil {
    17         fmt.Println("trueNil") //print trueNil
    18     }   
    19 
    20     if falseNil() == nil {
    21         fmt.Println("falseNil") //no print
    22     }   
    23 }
    View Code

     4 slice,map操作多协程需要加锁。

     1 package main
     2 
     3 import (
     4     "math/rand"
     5     "sync"
     6     "time"
     7 )
     8 
     9 func main() {
    10     Map := make(map[int]int)
    11     wg := &sync.WaitGroup{}
    12 
    13     for i := 0; i < 1000; i++ {
    14         go func() {
    15             wg.Add(1)
    16             defer wg.Done()
    17             for j := 0; j < 10000; j++ {
    18                 Map[rand.Int()] = rand.Int()
    19                 time.Sleep(time.Millisecond)
    20             }   
    21         }() 
    22     }   
    23     time.Sleep(time.Second * 5)
    24     wg.Wait()
    25     // 程序崩溃
    26 }
    View Code

     5 defer 调用函数时,函数在当前函数结束前调用,但传给调用函数的参数在defer所在行确定,而不在调用是确定。存在多个defer时,先出现后调用。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 type Data struct {
     8     data string
     9 }
    10 
    11 func Println(data Data) {
    12     fmt.Println(data.data)
    13 }
    14 func main() {
    15     data := Data{"world "}
    16     defer Println(data)
    17     data.data = "hello "
    18     defer Println(data)
    19     // 输出: hello world 而不是: hello hello 或 world hello
    20 }
    View Code

       

  • 相关阅读:
    一个简单而实用的JQ插件——lazyload.js图片延迟加载插件
    CSS预处理语言——less与sass的使用
    JQuery速成大法
    实现图片的循环滚动——JS的简单应用
    JS基础——循环很重要
    JS基础——入门必备
    做一个常规的banner图——负边距的使用、banner图的拼法
    网页侧边浮动条的实现
    如何做一个导航栏————浮动跟伪类(hover)事件的应用
    基于java代码的springmvc配置
  • 原文地址:https://www.cnblogs.com/--xiaoyao--/p/4987504.html
Copyright © 2020-2023  润新知