HTML 유효성 검사는 HTML 유효성 검사를 의미합니다. HTML 문서를 분석하고 이를 표준 HTML 규칙과 비교하여 오류 및 비표준 코드를 표시하는 프로세스입니다. 웹 페이지는 HTML을 사용하여 렌더링되며 HTML 자체는 HTML 사양을 규칙 및 표준으로 채택합니다. 다양한 브라우저 표준에 걸쳐 HTML 코드를 검증하세요!
chan
chan은 채널이라고도 합니다. 내용이 한쪽 끝에서 전송되어 다른 쪽 끝에서 읽혀지는 형태와 비슷합니다. 다음은 채널 정의 방법에 대한 소개입니다.
var 变量名 chan dataType
채널을 정의할 때 데이터 유형을 지정해야 합니다. 즉, 지정된 데이터 유형의 변수만 채널을 통과할 수 있다는 의미입니다.
채널 초기화
golang에서는 채널 유형 변수를 초기화할 때 채널을 두 가지 상황으로 나눌 수 있는데, 하나는 버퍼링된 채널이고 다른 하나는 버퍼링되지 않은 채널입니다.
다음은 두 가지 상황에서의 초기화 방법에 대한 소개입니다.
// 初始化不带缓冲的通道,通道中数据类型是intvar ch1 = make(chan int)// 初始化带10个缓冲的通道,通道中数据类型是stringvar ch2 = make(chan string,10)
작성하는 또 다른 방법은 채널을 정의하고 초기화하는 것입니다.
// 定义通道,并给通道初始化8个缓冲ch3 := make(chan int ,8)// 定义通道,并初始化为不带缓冲通道ch4 := make(chan string)
채널 할당
채널에 읽고 쓰면 차단이 발생할 수 있습니다. 상태.
버퍼링이 없는 채널은 쓰기 시 차단됩니다. 채널의 정보를 읽을 때까지 차단이 종료되지 않습니다.
버퍼 채널의 경우 정보가 채널에 기록될 때마다 채널 길이가 1씩 늘어납니다. 채널에서 정보를 성공적으로 읽을 때마다 채널 길이가 1씩 줄어듭니다. 채널 길이가 채널 버퍼 길이와 같은 경우 계속해서 채널에 정보를 쓰면 프로그램이 차단됩니다. 채널 길이가 채널 버퍼 길이보다 작으면 채널에 정보를 쓰면 차단이 발생하지 않습니다. 채널 길이가 5인 경우 여섯 번째로 채널에 정보를 쓰면 채널을 읽지 않았을 때 프로그램이 차단됩니다.
채널 작성의 구문 형식은 다음과 같습니다.
var ch = make(chan string,10)// 将字符串”hello"写入到通道中,通道长度加1ch <- "hello"
채널 읽기
채널이 비어 있습니다
1. 채널이 닫히지 않으면 프로그램은 차단 상태에 들어가 정보가 채널에 기록될 때까지 기다립니다
2. 채널이 닫혔으며 차단되지 않습니다. 채널의 데이터 유형(더티 데이터)의 초기 값이 반환됩니다. 예를 들어 채널이 chan int이면 반환 값은 0입니다. 채널이 chan이면 반환 값은 0입니다. 문자열인 경우 반환 값은 비어 있습니다.
채널이 비어 있지 않습니다
1. 채널이 닫혀 있지 않습니다. 읽기가 완료된 후 채널에서 정보를 한 번 읽어보세요.
2. 채널이 닫혔습니다. 읽기가 완료된 후
채널 읽기 작업을 진행합니다.
val,ok := <-ch
어설션을 사용하여 채널의 값을 읽고 여전히 있는지 확인합니다. 채널에 정보가 없고 채널이 폐쇄된 경우, 채널이 폐쇄되지 않았으나 채널에 정보가 없는 경우 ok 값이 false입니다. 채널에 콘텐츠가 있으면 프로그램이 차단됩니다. ok 값은 true입니다.
어설션을 사용하지 않고 채널을 읽는 또 다른 방법
val := <-ch
채널 쓰기 및 읽기
버퍼되지 않은 채널 읽기 예제 방법:
package mainimport ( "fmt")func main() { // 定义一个不带缓冲的通道,通道中数据类型是int var c = make(chan int) // 开启一个携程,读取通道中的内容 go func() { fmt.Println("写入信息是:", <-c) }() // 向通道中写入数据 c <- 1}
출력 결과:
写入信息是: 1
버퍼된 채널을 읽을 때 채널을 읽고 채널의 데이터 길이가 버퍼 길이보다 크지 않으면 차단되지 않습니다. 그러나 버퍼링된 채널을 읽을 때 채널에 내용이 없으면 프로그램은 여전히 차단 상태에 들어갑니다. 따라서 버퍼링된 채널은 쓰기에만 영향을 미칩니다. 예는 다음과 같습니다.
package mainimport ( "fmt")func main() { var c = make(chan int, 3) c <- 1 c <- 2 c <- 3 //c <- 4 fmt.Println("end") }
출력 정보는 다음과 같습니다.
end
3개의 버퍼가 있는 채널에 콘텐츠를 쓰는 경우 3번만 기록되므로 채널 길이는 버퍼 길이와 정확히 같습니다. 프로그램이 차단되지 않습니다. c <- 4 앞의 주석이 제거되면 이 채널을 읽는 프로그램이 없으므로 주 프로그램은 교착 상태에 들어가 예외가 발생합니다.
코루틴 통신
다음 예제 코드에 표시된 것처럼 채널 유형 변수는 기본적으로 주소입니다.
package mainimport ( "fmt")func main() { var c = make(chan int, 3) fmt.Println(c) }
출력 결과:
0xc042072080
따라서 채널 유형 변수가 매개변수로 함수에 전달되면, 채널의 값을 직접 수정할 수 있습니다. chan 형 변수는 주소이지만 golang에서는 chan 형 변수를 연산하기 위해 값 연산자(*)를 사용하는 것을 허용하지 않습니다. 하지만 chan 형 변수에 먼저 주소 연산자(&)를 사용한 뒤 값 연산자(*)를 사용하면 이 연산 방식은 여전히 정상적으로 실행될 수 있지만 함수 호출에서 목적이 아닌 이상 큰 의미는 없습니다. chan 유형 변수를 재정의하여 원래 변수를 대체합니다.
Chan의 기능은 코루틴 간의 동기화 기능을 효과적으로 구현할 수 있습니다. 버퍼링되지 않은 채널은 강제 동기화를 달성할 수 있는 제로 허용 대기이며, 버퍼링된 채널은 일정량의 허용 대기이며 특정 시간 차이를 허용하는 동기화를 달성할 수 있습니다.
간단한 코루틴 간 통신 예:
package mainimport ( "fmt" "time")func main() { var c = make(chan int) go func() { fmt.Println("待命模式:") // 读取通道时产生阻塞,等待其他协程向通道写入信息 fmt.Println("命令代码是:", <-c) }() go func() { // 延时3秒,向通道中写入信息 time.Sleep(time.Second * 3) fmt.Println("发送命令:") c <- 8 close(c) }() time.Sleep(time.Second * 5) fmt.Println("执行完成") }
출력 정보:
待命模式: 发送命令: 命令代码是: 8 执行完成
관련 권장 사항:
HTML HTML 유효성 검사_HTML/Xhtml_웹 페이지 제작
위 내용은 Go 요소의 키워드가 위치한 곳은-chan 채널입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!