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)
}