go 基础语法

 变量

// 变量定义
// 方式一   先定义, 在赋值
var value string
value = "dddd"
fmt.Printf("value is :%s\n", value)

// 方式二  定义直接复制
var value2 string = "heihei"
fmt.Printf("value2:%s\n", value2)

// 方式三  定义直接赋值,使用自动推导 :=    主推这种
value3 := "ddd"
fmt.Printf("value3: %s\n", value3)

// 变量引用
test(value3, 110)

// 平行赋值
i, j := "this is i", "this is j"
fmt.Printf("i: %s, j: %s\n", i, j)

// 交叉赋值
i, j = j, i
fmt.Printf("i: %s, j: %s\n", i, j)

d := 10
fmt.Println("d: ", d)

 

基础数据类型

/*
	基础数据类型:

	int8 int16 int32 int64

	unit8 ... unit64

	float32  float64

	true/false
*/

 

自增语法

// 自增语法
// 只有:i++ 或 i-- 其他的--i, ++i都没有
// PS 自增语法必须单独一行,否则语法报错
ii := 20
// ii++
fmt.Printf("ii: %d\n", ii)

 

go 指针/* go 指针:

	/*
		go 指针:
		结构体成员调用时: c中 P->name,    go中 P.name
		go使用指针时会自动调用内部的垃圾回收机制(gc: garbage collector),开发人员不需要手动释放内存
		c语言不允许返回栈上指针,go语言可以返回栈上指针,程序会在编译的时候确定变量的分配位置
		编译的时候,如果发现有必要的话,就将变量分配到堆上
	*/
	// 定义指针方式一
	name := "liming"
	prt := &name
	fmt.Printf("指针变量: %s\n", *prt)
	fmt.Println("指针地址:", &name)

	// 定义指针方式二
	name2prt := new(string)
	*name2prt = "xiaohua"
	fmt.Println("name2:", *name2prt)
	fmt.Println("name2prt:", name2prt)

	// 可以返回栈上指针,编译器在编译时,会自动判断这段代码,将city变量分配在堆上
	resp := test_city()
	fmt.Println("city: ", *resp, "address: ", resp)

	// 空指针, c 中 null , go 中 nil
	// 判断空指针,if 两端不用加(),即使有一行代码,也必须使用{}
	if resp == nil {
		fmt.Println("resp 是空指针")
	} else {
		fmt.Println("resp 是非空指针")
	}


// 定义一个返回sting指针的函数, go返回值写在参数 后面
func test_city() *string {
	city := "成都"
	prt := &city
	return prt
}

 

字符串

// 字符串
// 1、原生输出(使用反引号 `` )
str := `
usage: 
	-a    this is all
	-h    this is help
	-v    version
`
fmt.Println("name str: ", str)

// 长度, len()
l1 := len(str)
fmt.Println("l1: ", l1)

// for 不需要加()
names := "limiang"
for i := 0; i < len(names); i++ {
	fmt.Printf("i: %d,  v: %c\n", i, names[i])
}

// 字符串拼接
str1 := "ddd"
str2 := "ooo"
fmt.Println("str1 + str2 = ", str1+str2)

 

不支持语法

// 不支持的语法
/*
	1、自增自减: ++i, --i
	2、不支持地址加减
	3、不支持三目运算符 ?:(如:x:= 10 > 12 ? 10 : 12)
	4、只有false才能逻辑假, nil 和 0 都不能
*/

 

权限

/*
访问权限:

1、在go中访问权限是通过首字母大写来控制的
2、import ===> 如果包名不同, 只有首字母大写的才是public的
3、对于结构体(类)中的方法、属性,只有首字母大写才能在其他包中引用
*/

 

结构体(类)

package main

import (
	"fmt"
)

/*
继承--操作
*/

// 被继承的结构体(父类)
type Human struct {
	name   string
	age    int
	gender string
}

// 继承结构体(子类)
type Teacher struct {
	Human   // 直接写为继承,  hum: Human --> 包含hum变量,此时为类的嵌套
	subject string
}

func main() {
	// 实例化时指定参数
	t := Teacher{
		Human: Human{
			name:   "笑话",
			age:    5,
			gender: "dog",
		},
		subject: "旺旺",
	}
	fmt.Println("t: ", t)
	fmt.Println("t: ", t.Human.name)
	t.age = 3 // 相同的属性, 子类会覆盖父类
	fmt.Println("t: ", t.Human.age)

	t2 := Teacher{}
	t2.name = "limin"
	t2.age = 16
	t2.gender = "女"
	t2.subject = "数学"
	fmt.Println("t2 : ", t2)
	fmt.Println("t2.Hume.age", t2.Human.age)
}

打印结果:

 

posted @ 2022-09-06 17:34  萤huo虫  阅读(25)  评论(0编辑  收藏  举报