go-chapter2__早鸟教程

chan:

package main

import "fmt"

func sum(s []int,c chan int){

   sum := 0

   for _,v := range s{

      sum += v

   }

   c <- sum

}

func main(){

   s1 := []int{1,2,3,4,5,6,7,8}

   c :=  make(chan int)

   go sum(s1[len(s1)/2:],c)

   go sum(s1[:len(s1)/2],c)

   x,y := <- c, <- c

   fmt.Println(x,y,x+y)

}

func say(s string) string{// 此处没有返回值  就不加strng type 了

   var i int = 0

   for i=0;i<5;i++{  // or for i:= 0;i<5;i++ {}

      time.Sleep(100 * time.Millisecond)

      fmt.Println(s)

   }

}

interface: 多写几遍吧

package main

import "fmt"

type Phone interface{

   call()

}

type  NojiyaPhone struct{

}

func (nojiyaPhone NojiyaPhone) call(){

   fmt.Println("Im Nojiya,Im call you")

}

type Iphone struct{

}

func (iphone Iphone) call(){

   fmt.Println("Im iphone ,Im call you")

}

func main(){

   var phone Phone

   phone=new(NojiyaPhone)

   phone.call()

   phone=new(Iphone)

   phone.call()

}

//--------------------------------------------

func main(){

   var s1 int = 15

   for i = 0;i< 15;i++{

      fmt.Println(fbnc(int(i)))

   }

}

0207_recursion.go:27:6: undefined: i

0207_recursion.go:28:24: undefined: i

//-----------------------------------------------------------------

定义一个基础变量的三种方式:

//ok

//var si int

//si = 15

// ok

//var si int = 15

//ok

si := 15

println 好像可以换行 print  不可以

for i,c := range "go"{

  fmt.Println(i,c)

}

for i,c := range "go"{

  fmt.Print(i,c)

}

for i,j := range map1{

   fmt.Println(i+"首都是"+j)

   fmt.Println(i,"首都是",j)

}

go 的数组 大小 固定:如

        

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

我们也可以通过字面量在声明数组的同时快速初始化数组:

balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

如果数组长度不确定,可以使用 … 代替数组的长度,

编译器会根据元素个数自行推断数组的长度:

var balance = […]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

balance := […]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

但:  引入切片 大小不定 可变、eg:

切片初始化 注意后面是{} 不是[]

//slice := []int[1,2,3,4,5,6]

var slice = []int{1,2,3,4,5,6}

slice := []int{1,2,3,4,5,6}

s2 := make([]int, 0, 5)

s2 := make([]int{1,2,3,4,5}, 5, 5) 不可

map:

    var map1 map[string]string //只声明 没有make 申请空间

    //map1 = make(map[string]string) // 未初始化 nil panic

    //panic: assignment to entry in nil map

or

var map1 map[string]string // 声明

    map1 = make(map[string]string) //初始化

or

map1 := make(map[string]string) // 声明 又 初始化

------------------

kvs := map[string]string{"a": "apple", "b": "banana"}

or

kvs := map[int]string{2: "apple", 4: "banana"}

for i,j := range map1{

   if j == "shouer"{

      delete(map1,i)

      //delete(map1,"hanguo") // delete key or values 的两种方式

   }

// error

//map1 := make(map[string]string) 

//map1 = {"zhonguo":"beijing","riben":"dongjing","hanguo":"shouer","chaoxuan":"hancheng"}

// error   

//map1 := make(map[string]string){"zhonguo":"beijing","riben":"dongjing","hanguo":"shouer","chaoxuan":"hancheng"}

// ok

//map1 := map[string]string{"zhonguo":"beijing","riben":"beijing","hanguo":"shouer","chaoxuan":"hancheng"}

注意for if lese 的写法:都是没有右侧的:的

nums := []int{2,3,4}

for i ,j := range nums{

  if j == 4 {

    fmt.Printf("%d\n",i)

  }

}

一些不熟悉的变量:

var 

iota

fallthrough

rune  == int32

 fmt.Printf("第 1 行 - a 变量类型为 = %T\n", a );

   fmt.Printf("第 2 行 - b 变量类型为 = %T\n", b );

array = []int{1,2,3,4,5,6,7,8,9}

// 从array取,左指针索引为0,右指针为5,切片是从array切的,

// 而且cap函数只计算左指针到原array最后的值的个数

slice = array[0:5]  // slice ==> {1, 2, 3, 4, 5}

cap(slice) // == 9,因为左指针索引为0,到结尾有9个数,cap为9

slice = slice[2:] // slice ==> {3, 4, 5}

cap(slice) // == 7 左指针偏移了2步,所以cap为9-2=7

初遇unsafe.Sizeof()时,以为Go语言中的sizeof和C语言的sizeof不太一样,对于算出的值也是一脸懵逼。深入了解才发现两者并没有区别,是自己误解了。

    package main

    import (

    "fmt"

    "unsafe"

    )

    func main(){

    var test string = "abc"

    a := len(test)

    b := unsafe.Sizeof(test)

    fmt.Println(a,b)

    }

最终的运算结果是:3,16

对于接触过python的同学来说,3很容易理解,但是16从何而来呢?

原来是因为unsafe.Sizeof返回的是数据类型的大小,而string在Go中并不是直存类型,它是一个结构体类型:

    type StringHeader struct {

            Data uintptr

            Len  int

    }

在64位系统上uintptr和int都是8字节,加起来就16了。

1.

Go 如何判断变量类型

Go 中判断变量的类型不是太方便。

var.(type)

reflect

var.(type)

通过 var.(type) 可以判断变量类型,不过必须在 switch 中使用

chan:

package main

import "fmt"

func sum(s []int,c chan int){

sum := 0

for _,v := range s{

sum += v

}

c <- sum

}

func main(){

s1 := []int{1,2,3,4,5,6,7,8}

c := make(chan int)

go sum(s1[len(s1)/2:],c)

go sum(s1[:len(s1)/2],c)

x,y := <- c, <- c

fmt.Println(x,y,x+y)

}

func say(s string) string{// 此处没有返回值 就不加strng type 了

var i int = 0

for i=0;i<5;i++{ // or for i:= 0;i<5;i++ {}

time.Sleep(100 * time.Millisecond)

fmt.Println(s)

}

}

interface: 多写几遍吧

package main

import "fmt"

type Phone interface{

call()

}

type NojiyaPhone struct{

}

func (nojiyaPhone NojiyaPhone) call(){

fmt.Println("Im Nojiya,Im call you")

}

type Iphone struct{

}

func (iphone Iphone) call(){

fmt.Println("Im iphone ,Im call you")

}

func main(){

var phone Phone

phone=new(NojiyaPhone)

phone.call()

phone=new(Iphone)

phone.call()

}

//--------------------------------------------

func main(){

var s1 int = 15

for i = 0;i< 15;i++{

fmt.Println(fbnc(int(i)))

}

}

0207_recursion.go:27:6: undefined: i

0207_recursion.go:28:24: undefined: i

//-----------------------------------------------------------------

定义一个基础变量的三种方式:

//ok

//var si int

//si = 15

// ok

//var si int = 15

//ok

si := 15

println 好像可以换行 print  不可以

for i,c := range "go"{

fmt.Println(i,c)

}

for i,c := range "go"{

fmt.Print(i,c)

}

for i,j := range map1{

fmt.Println(i+"首都是"+j)

fmt.Println(i,"首都是",j)

}

go 的数组 大小 固定:如

        

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

我们也可以通过字面量在声明数组的同时快速初始化数组:

balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

如果数组长度不确定,可以使用 … 代替数组的长度,

编译器会根据元素个数自行推断数组的长度:

var balance = […]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

balance := […]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

但:  引入切片 大小不定 可变、eg:

切片初始化 注意后面是{} 不是[]

//slice := []int[1,2,3,4,5,6]

var slice = []int{1,2,3,4,5,6}

slice := []int{1,2,3,4,5,6}

s2 := make([]int, 0, 5)

s2 := make([]int{1,2,3,4,5}, 5, 5) 不可

map:

    var map1 map[string]string //只声明 没有make 申请空间

    //map1 = make(map[string]string) // 未初始化 nil panic

    //panic: assignment to entry in nil map

or

var map1 map[string]string // 声明

    map1 = make(map[string]string) //初始化

or

map1 := make(map[string]string) // 声明 又 初始化

------------------

kvs := map[string]string{"a": "apple", "b": "banana"}

or

kvs := map[int]string{2: "apple", 4: "banana"}

for i,j := range map1{

if j == "shouer"{

delete(map1,i)

//delete(map1,"hanguo") // delete key or values 的两种方式

}

// error

//map1 := make(map[string]string)

//map1 = {"zhonguo":"beijing","riben":"dongjing","hanguo":"shouer","chaoxuan":"hancheng"}

// error

//map1 := make(map[string]string){"zhonguo":"beijing","riben":"dongjing","hanguo":"shouer","chaoxuan":"hancheng"}

// ok

//map1 := map[string]string{"zhonguo":"beijing","riben":"beijing","hanguo":"shouer","chaoxuan":"hancheng"}

注意for if lese 的写法:都是没有右侧的:的

nums := []int{2,3,4}

for i ,j := range nums{

if j == 4 {

fmt.Printf("%d\n",i)

}

}

一些不熟悉的变量:

var 

iota

fallthrough

rune  == int32

 fmt.Printf("第 1 行 - a 变量类型为 = %T\n", a );

   fmt.Printf("第 2 行 - b 变量类型为 = %T\n", b );

array = []int{1,2,3,4,5,6,7,8,9}

// 从array取,左指针索引为0,右指针为5,切片是从array切的,

// 而且cap函数只计算左指针到原array最后的值的个数

slice = array[0:5] // slice ==> {1, 2, 3, 4, 5}

cap(slice) // == 9,因为左指针索引为0,到结尾有9个数,cap为9

slice = slice[2:] // slice ==> {3, 4, 5}

cap(slice) // == 7 左指针偏移了2步,所以cap为9-2=7

初遇unsafe.Sizeof()时,以为Go语言中的sizeof和C语言的sizeof不太一样,对于算出的值也是一脸懵逼。深入了解才发现两者并没有区别,是自己误解了。

    package main

    import (

    "fmt"

    "unsafe"

    )

    func main(){

    var test string = "abc"

    a := len(test)

    b := unsafe.Sizeof(test)

    fmt.Println(a,b)

    }

最终的运算结果是:3,16

对于接触过python的同学来说,3很容易理解,但是16从何而来呢?

原来是因为unsafe.Sizeof返回的是数据类型的大小,而string在Go中并不是直存类型,它是一个结构体类型:

    type StringHeader struct {

            Data uintptr

            Len  int

    }

在64位系统上uintptr和int都是8字节,加起来就16了。

1.

Go 如何判断变量类型

Go 中判断变量的类型不是太方便。

var.(type)

reflect

var.(type)

通过 var.(type) 可以判断变量类型,不过必须在 switch 中使用

func Type(i interface{}) {

switch i.(type) {

case string:

fmt.Println("string")

case int:

fmt.Println("int")

case bool:

fmt.Println("bool")

default:

fmt.Println("default")

}

}

reflect

也可以通过反射的方式来获取变量类型

package main

import (

"fmt"

"reflect"

)

func main() {

t := reflect.TypeOf("Hello World")

fmt.Println(t)

}

reflect

也可以通过反射的方式来获取变量类型

package main

import (

    "fmt"

    "reflect"

)

func main() {

    t := reflect.TypeOf("Hello World")

    fmt.Println(t)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值