1:定义string字符串,返回的是指针
例子:
s := "hello"
if s[1] != 'e' { os.Exit(1) }
s = "good bye"
var p *string = &s
*p = "ciao"
下面的语句就是非法的.
s[0] = 'x' (*p)[1] = 'y'
注意:
1:string返回的是指针,但是这个值不能被修改。就像const char*
2:string和slice
package main
import (
"fmt"
"reflect"
)
func test(srcData []byte){
fmt.Println(len(srcData))
for i:=0;i<len(srcData);i++{
srcData[i] = srcData[i] + 1;
}
}
func main(){
a := [10]byte{0x30,0x31,0x32}
fmt.Println(a)
test(a[0:]) // ok,数组转换成切片,传递的是引用
//test(&a) // error,数组到底是啥类型
var b interface{}
b = a
dd := reflect.ValueOf(b)
fmt.Println(dd.Kind()) //结果是:array 。表明是一个数组
b = &a
gg := reflect.ValueOf(b)
fmt.Println(gg.Kind())//结果是:ptr 。表明是一个指针。但是注意,是指向[10]byte的指针。不是我们理解的[]byte
fmt.Println(a)
var e1 […]int{1,1,2,3} //这个是一个数组,编译器会自动计算长度
var e2 [10]int{1,2,2,3} //这个是数组
var e3 []int{1,2,3,4} //这个是一个切片
var e4 [10]int{1,2,3,4}[0:]
}
注意:1:数组传参数给函数,一般使用切片。
2:标准定义切片方法。s:= make([]int, 3, 10);//一个slice,有三个参数 类型、slice长度、slice底层的array长度,即slice的最大容量。
3:数组一般用于切片里面真正存储数据的容器。传递一个数组的参数,是指传递。数组的尺寸是数组类型的一部分。[10]int [20]int 他们的类型完全不一样4:切片传递是引用类型。所以在go里面,尽量传递切片。
3:定义变量
import "fmt"
type student struct {
a int
b int
}
func sum(a *student){
fmt.Println(a.a + a.b)
}
func main(){
//定义一个变量
var a student
a.a = 123
a.b = 333
sum(&a)
//定义一个变量,并且初始化
d := student{a:123,b:3333}
sum(&d)
//new一个变量,返回的是指针
b := new(student)
b.a = 1
b.b = 2
sum(b)
}
4:常用风格以及易混淆点
a:golang里面不需要分号。只有在for和两行语句写在一行。但是地道的程序分号只会在for里面出现
b:golang里面if,for不需要()。但是需要{}。可以将多行语句写在if后,用分号分开.
c:不要把{},左{单独写成一行
d:go里面循环语句只有for。但是for有不同的表现形式。
1)for init; condition; post { } //类似 C 的 for
2)for condition { } //类似 C 的 while
3)for { } // 类似 C 的 for(;;)
5:.(type) 操作,通过一定的机制,可以知道这个变量的类型是多少。只能在switch里面使用。
package main
import "fmt"
func main(){
var a int = 1000
//switch b:a.(type){ //错误
var d interface{} = a
switch b:=d.(type){
case int:
fmt.Println("type is int %T",b)
case *int:
fmt.Println("type is *int,%T",b)
default :
fmt.Println("type is unkown,%T",b)
}
}
http://www.jmcneil.net/ 这里有说明
更多通过变量得到这个数据类型,看reflect包.